Добре, така че макар да съм съгласен отчасти, че трябва да се поразровите и да научите повече за левите съединения, има и някои трудности да отговорите правилно на този въпрос, които може да бъдат пропуснати от начинаещия. Ще продължа и ще ви помогна да отговорите, но бих препоръчал да научите повече за присъединяванията.
Точната ми заявка ще зависи от наличните индекси, но много вероятно прилича на нещо подобно:
SELECT a.*
FROM products AS a
LEFT JOIN (
SELECT product_id FROM order_products as b
INNER JOIN orders AS c
ON b.order_id = c.order_id
WHERE c.date_ordered >= date_sub(c.date_ordered, INTERVAL 7 day)
GROUP BY product_id
) AS d
ON a.product_id = d.product_id
WHERE d.product_id IS NULL
Това, което правя е, че пиша подзаявка, която обединява поръчки и продукти заедно, където date_ordered попада в определен период от време (бих препоръчал да научите за функцията date_sub тук:http://www.w3schools.com/sql/func_date_sub.asp и също така направете няколко бързи SELECT date_sub(date_ordered, INTERVAL X DAY) FROM заявки за поръчки, за да сте сигурни, че разбирате как работи това изчисление на практика.
Сега получавам моя списък с поръчки за последните X дни (7 в заявката по-горе) и го свързвам с продуктовата таблица на поръчките, за да получа поръчаните продукти. Тук искам да дедуплирам продуктите си по същество. Product_id =300 може да е поръчан 70 пъти. Product_id =200 може да е поръчан 50 пъти. Какъвто и да е случаят, не искам да присъединявам 70 записа и 50 записа към моята продуктова таблица за идентификатори на продукти 300 и 200, така че ги дедуплирам. Последният оператор GROUP BY прави това. Функционално е същото нещо като писането на DISTINCT (въпреки че може да има малки разлики в начина, по който се изчисляват при определени обстоятелства, нито едно от тези обстоятелства не изглежда да е приложимо тук... използвайте DISTINCT, ако това е по-ясно за вас)
След като имам своя списък с уникални идентификационни номера на продукти, поръчани през последните X дни, се присъединявам към него с моята продуктова таблица. Тук използвам ляво съединение. Подобно на коментарите, отбелязани по-горе, ще искате да разгледате идеята за присъединяване доста внимателно. Направете го, ако още не сте го направили.
Последно, прилагам WHERE филтър, който казва "WHERE d.product_id IS NULL." Това, което прави, е да каже:„Добре, ако product_id =Y е поръчан през последните X дни, тогава той ще се присъедини към моята таблица с продукти успешно с a.product_id =d.product_id. Ако не е поръчан, тогава a. product_id ще съществува в моя набор от резултати, но d.product_id няма. Тоест d.product_id ще бъде null."
Този последен обрат може да е частта, която не е очевидна/открояваща се.
Надявам се това да помогне.