感谢您查看我的问题!我一直试图找出单个查询来执行以下操作,但一直没有成功。我真的很感激任何帮助。提前谢谢:-)
我正在为我的电子商务商店制作管理页面,其中显示的产品在过去的X天内没有销售。有三个表需要使用...
Table: products
Column: product_id (int)
此表/列包含商店中的所有商品
Table: orders
Columns: order_id (int), date_ordered (datetime)
此表包含order_id标识的所有订单以及订购日期(date_ordered)。
Table: order_products
Column: order_id (int), product_id (int)
此表包含所有订购产品(product_id)和相应订单(order_id)的完整列表。
因此,我试图找出的查询将使用表格中的order_id和order_products来确定过去X天内哪些产品已售出...然后从产品表中返回任何products_id在过去的X天里没有出售。
有什么建议吗?任何帮助将非常感谢!谢谢:-)
答案 0 :(得分:1)
好的,虽然我部分同意你应该做一些讨论并了解更多关于左连接,但也有一些棘手的问题可以正确地回答这个问题,这可能会在初学者身上丢失。我会继续帮助你回答它,但我建议你更多地了解联接。
我的确切查询将取决于可用的索引,但很可能类似于以下内容:
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条记录加入产品ID 300和200的产品表中,因此我对它们进行了重复删除。最后一个GROUP BY语句就是这样做的。它在功能上与编写DISTINCT相同(尽管在某些情况下如何计算这些差异可能存在细微差别,但这些情况似乎都不适用于此...如果对您来说更清楚,请使用DISTINCT)
在我获得过去X天订购的唯一产品ID列表后,我将其与产品表一起加入。在这里,我使用左连接。就像上面提到的评论一样,你会非常仔细地研究联接的概念。这样做,如果你还没有。
最后,我应用一个WHERE过滤器,上面写着“WHERE d.product_id IS NULL”。这是做什么的,“好的,如果在过去的X天内订购了product_id = Y,那么它将使用a.product_id = d.product_id成功加入我的产品表。如果没有订购,那么a。 product_id将存在于我的结果集中,但d.product_id不会。也就是说,d.product_id将为null。“
最后的扭曲可能是那些不明显/突出的部分。
希望这会有所帮助。