#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
для использования aCOUNT
в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