Я использую подзапрос, чтобы получить популярные продукты, которые были проданы в таблице 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.
Рефакторируйте ваш подзапрос соединению, что-то вроде этого.
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
После 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