Получить популярные товары уже продано?

0

Я использую подзапрос, чтобы получить популярные продукты, которые были проданы в таблице 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_id с count() но я получаю агрегатную ошибку sql.

Теги:
database

2 ответа

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. Если вы хотите, чтобы и идентификатор продукта, и имя продукта отображались, используйте этот вид запроса.

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.name и GROUP BY products.id. Но для этого вы зависите либо от устаревшей функции MySQL, либо от дополнительной функции SQL99. Многие программисты любят избегать таких вещей. Прочтите это для получения дополнительной информации. https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

  • 1
    Спасибо. Разве это не должно быть сгруппировано по order_products.product_id?
  • 0
    Может быть, но, вероятно, не должно быть. Пожалуйста, смотрите мое редактирование.
0

После sql поможет вам.

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

Поскольку вы выбираете product.name, вы должны использовать одно и то же поле в своей группе по предложению.

Вы можете узнать фактическую причину этого, прочитав правило 1 в следующей ссылке: http://www.informit.com/articles/article.aspx?p=664143&seqNum=6

Ещё вопросы

Сообщество Overcoder
Наверх
Меню