Tôi không hiểu tại sao bạn nên cần khóa tổng hợp, vì vậy tôi sẽ sử dụng bảng này để thay thế:
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'
;
cú pháp số học ngày tháng có thể sai nhưng bạn hiểu rồi đấy
xem ở trên, thêm ORDER BY curr.weight - prev.weight DESC
và LIMIT N
cho hai câu hỏi cuối cùng:đừng suy đoán, hãy kiểm tra các kế hoạch thực hiện. (postgresql có EXPLAIN ANALYZE
, dunno about mysql) có thể bạn sẽ thấy mình cần lập chỉ mục các cột tham gia vào WHERE
và JOIN
, không phải những thứ tạo nên tập kết quả.