获得热门产品已售出?

时间:2018-03-04 18:09:45

标签: mysql database

我正在使用子查询来获取已在order_products表格中销售的热门产品。

SELECT 
   products.name, 
   (SELECT count(product_id) FROM order_products WHERE order_products.product_id = products.id) as total FROM products 
ORDER BY total DESC LIMIT 10

这个查询似乎运行正常,但我觉得有更好的方法而不是使用子查询?

我已尝试将GROUP BY order_products.product_idcount()一起使用,但我收到了汇总的sql错误。

2 个答案:

答案 0 :(得分:0)

以下sql会帮助你。

  

SELECT products.name,count(*)FROM order_products INNER JOIN   产品ON order_products.product_id = products.id GROUP BY   products.name ORDER BY COUNT(*)DESC LIMIT 10;

由于您选择的是product.name,因此您应该在 group by 子句中使用相同的字段。

您可以通过阅读以下链接中的规则1来了解实际原因: http://www.informit.com/articles/article.aspx?p=664143&seqNum=6

答案 1 :(得分:0)

将子查询重构为连接,类似这样。

SELECT 
    products.name, 
    COUNT(*) AS count
FROM
   products
JOIN
   order_products ON order_products.product_id = products.id
GROUP BY
   products.name
ORDER BY COUNT(*) DESC
LIMIT 10

这几乎等同于你拥有的东西。但它以许多SQL程序员更容易阅读的方式表达了您的意图。而且,许多MySQL版本中的查询规划器都可以很好地完成这一点,它们可能没有子查询版本。

修改 GROUP BY中提到的列也应出现在SELECT子句中。如果您希望同时显示产品ID和产品名称,请使用此类查询。

SELECT 
    products.id, products.name, 
    COUNT(*) AS count
FROM
   products
JOIN
   order_products ON order_products.product_id = products.id
GROUP BY
   products.id, products.name
ORDER BY COUNT(*) DESC
LIMIT 10

您可以说出SELECT products.nameGROUP BY products.id。但要实现这一点,您需要依赖于MySQL的弃用功能或SQL99的可选功能。许多程序员喜欢避免这样的事情。阅读本文以获取更多信息。 https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html