Okej, więc chociaż częściowo zgadzam się, że powinieneś trochę poszperać i dowiedzieć się więcej o lewych łączeniach, istnieje również pewna trudność w prawidłowej odpowiedzi na to pytanie, która może zostać zgubiona u początkującego. Pomogę Ci odpowiedzieć, ale polecam dowiedzieć się więcej o dołączeniach.
Moje dokładne zapytanie zależałoby od dostępnych indeksów, ale najprawdopodobniej przypominałoby coś takiego:
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
To, co robię, to pisanie podzapytania, które łączy zamówienia i zamówienia produktów, gdzie date_ordered mieści się w określonym zakresie dat (polecam zapoznanie się z funkcją date_sub tutaj:http://www.w3schools.com/sql/func_date_sub.asp a także wykonaj kilka szybkich zapytań o zamówienia SELECT date_sub(date_ordered, INTERVAL X DAY) FROM, aby upewnić się, że rozumiesz, jak to obliczenie działa w praktyce.
Teraz otrzymuję listę zamówień z ostatnich X dni (7 w powyższym zapytaniu) i łączę ją z tabelą produktów zamówień, aby uzyskać zamówione produkty. Tutaj chcę w zasadzie deduplikować moje produkty. Product_id =300 mogło zostać zamówione 70 razy. Product_id =200 mógł zostać zamówiony 50 razy. Niezależnie od przypadku nie chcę łączyć 70 rekordów i 50 rekordów w mojej tabeli produktów dla identyfikatorów produktów 300 i 200, więc je zdeduplikowałem. To ostatnie oświadczenie GROUP BY to robi. Funkcjonalnie jest to to samo, co pisanie DISTINCT (chociaż mogą występować niewielkie różnice w sposobie ich obliczania w pewnych okolicznościach, żadna z tych okoliczności nie wydaje się tutaj mieć zastosowania... użyj DISTINCT, jeśli jest to dla Ciebie bardziej zrozumiałe)
Po otrzymaniu listy unikalnych identyfikatorów produktów, które zostały zamówione w ciągu ostatnich X dni, dołączam ją do tabeli produktów. Tutaj używam lewego sprzężenia. Podobnie jak w komentarzach wymienionych powyżej, będziesz chciał przyjrzeć się pojęciu złączeń dość uważnie. Zrób to, jeśli jeszcze tego nie zrobiłeś.
Na koniec stosuję filtr WHERE, który mówi „WHERE d.product_id IS NULL”. To oznacza:„OK, jeśli product_id =Y został zamówiony w ciągu ostatnich X dni, to pomyślnie dołączy do mojej tabeli produktów z a.product_id =d.product_id. Jeśli nie został zamówiony, a. product_id będzie istniał w moim zestawie wyników, ale d.product_id nie. Oznacza to, że d.product_id będzie miał wartość null."
Ten ostatni zwrot może być częścią, która nie jest widoczna / wyróżnia się.
Mam nadzieję że to pomoże.