Saya tidak mengerti mengapa Anda membutuhkan kunci sintetis, jadi saya akan menggunakan tabel ini sebagai gantinya:
CREATE TABLE foodbar (
user_id INT NOT NULL
, created_at date not null
, weight double not null
, PRIMARY KEY (user_id, created_at)
);
SELECT curr.user_id, curr.weight - prev.weight
FROM foodbar curr, foodbar prev
WHERE curr.user_id = prev.user_id
AND curr.created_at = CURRENT_DATE
AND prev.created_at = CURRENT_DATE - INTERVAL '7 days'
;
sintaks aritmatika tanggal mungkin salah tetapi Anda mendapatkan idenya
lihat di atas, tambahkan ORDER BY curr.weight - prev.weight DESC
dan LIMIT N
untuk dua pertanyaan terakhir:jangan berspekulasi, periksa rencana eksekusi. (postgresql memiliki EXPLAIN ANALYZE
, tidak tahu tentang mysql) Anda mungkin perlu mengindeks kolom yang berpartisipasi dalam WHERE
dan JOIN
, bukan yang membentuk kumpulan hasil.