SQL: порядок по количеству возвращает только первую строку

#sql

#sql

Вопрос:

У меня есть две таблицы products и product_views .

Я хочу написать запрос, который возвращает продукты с наибольшим количеством просмотров.

products в таблице есть id name столбцы и . product_views имеет столбцы id , customer_id , product_id . Подсчет основан на product_id столбце.

Вот мой запрос:

 SELECT * 
FROM products
LEFT JOIN product_views ON products.id = product_views.product_id
ORDER BY COUNT(product_views.product_id) DESC;
 

Проблема в том, что он возвращает только первый продукт. Я думаю, проблема в том, что изначально вся таблица product_views пуста (все значения равны нулю).

Как решить эту проблему?

Комментарии:

1. Я предполагаю, что вы используете MySQL, поскольку любая другая база данных заставила бы вас (правильно) использовать a GROUP BY для использования a COUNT в ORDER BY . Более старый (?) Версии MySQL слишком расслаблены в этом отношении и скорее дадут вам неправильный результат, чем ошибку. Попробуйте свои данные / запрос в — например — sqlfiddle.com и выберите другую базу данных, она укажет на вашу ошибку, и как только вы ее исправите, тот же запрос должен работать и с MySQL.

Ответ №1:

Исходя из ваших критериев, должно работать следующее —

 SELECT
 p.id,
 p.name,
 count(v.product_id) as views
FROM products p
LEFT JOIN product_views v
 ON p.id = v.product_id
 GROUP BY 1,2
ORDER BY views DESC;
 

Запрос игнорирует customer_id и подсчитывает product_ids на основе групп идентификаторов / имен.

Комментарии:

1. Это работает нормально, но мне интересно, что делает GROUP BY 1,2 строка?

2. GROUP BY 1,2 эквивалентно GROUP BY p.id , p.name . Это основано на позиции, т.Е.. p.id является позицией 1 и p.name это позиция 2.

Ответ №2:

Вычисляет количество в отдельном скрипте:

 SELECT products.id, products.name, pv.count FROM products
JOIN (SELECT product_id, COUNT(*) as count FROM product_views GROUP BY product_id)
pv ON (products.id = product_id )
ORDER BY pv.count DESC;
 

Пример: SQL Fiddle