Nie rozumiem, dlaczego potrzebny jest klucz syntetyczny, więc zamiast tego użyję poniższej tabeli:
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'
;
składnia arytmetyczna dat jest prawdopodobnie nieprawidłowa, ale masz pomysł
patrz wyżej, dodaj ORDER BY curr.weight - prev.weight DESC
i LIMIT N
na ostatnie dwa pytania:nie spekuluj, zbadaj plany egzekucyjne. (postgresql ma EXPLAIN ANALYZE
, nie wiem o mysql) prawdopodobnie okaże się, że musisz zindeksować kolumny, które uczestniczą w WHERE
i JOIN
, a nie te, które tworzą zestaw wyników.