さて、私はあなたがいくつかの突っ込みをして左結合についてもっと学ぶべきであることに部分的に同意しますが、初心者には失われるかもしれないこの質問に正しく答えるにはいくつかのトリッキーもあります。先に進んで答えるのを手伝いますが、結合についてもっと学ぶことをお勧めします。
私の正確なクエリは利用可能なインデックスによって異なりますが、次のようになっている可能性があります。
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 orderクエリを実行して、この計算が実際にどのように機能するかを確実に理解してください。
これで、過去X日間の注文リスト(上記のクエリでは7)を取得し、それを注文製品テーブルと結合して、注文された製品を取得します。ここでは、基本的に製品を重複排除したいと思います。 Product_id=300は70回注文された可能性があります。 Product_id=200は50回注文された可能性があります。いずれにせよ、製品ID 300と200の製品テーブルに70レコードと50レコードを結合したくないので、それらを重複排除しました。その最後のGROUPBYステートメントがそれを行います。機能的にはDISTINCTを作成するのと同じです(特定の状況ではこれらの計算方法にわずかな違いがある場合がありますが、ここではそれらの状況のいずれも当てはまらないようです...それがより明確な場合はDISTINCTを使用してください)
過去X日間に注文された一意の製品IDのリストを取得したら、それを製品テーブルに結合します。ここでは、左結合を使用します。上記のコメントのように、結合の概念をかなり注意深く調べたいと思うでしょう。まだ行っていない場合は、それを行ってください。
最後に、「WHEREd.product_idISNULL」というWHEREフィルターを適用します。これは、「わかりました。過去X日間にproduct_id =Yが注文された場合、a.product_id =d.product_idで商品テーブルに正常に参加します。注文されなかった場合は、a。 product_idは私の結果セットに存在しますが、d.product_idは存在しません。つまり、d.product_idはnullになります。 "
その最後のひねりは、目立たない/目立たない部分かもしれません。
お役に立てれば。