Подсчет нескольких строк в MySQL в одном запросе

В настоящее время у меня есть таблица, в которой хранятся статистические данные, такие как просмотры, загрузки, покупки и т. Д. Для нескольких элементов. Чтобы получить один счет операции для каждого элемента, я могу использовать следующий запрос:

SELECT *, COUNT(*) FROM stats WHERE operation = 'view' GROUP BY item_id 

Это дает мне все предметы и подсчет их взглядов. Затем я могу изменить «представление» на «покупку» или «загрузить» для других переменных. Однако это означает три отдельных обращения к базе данных.

Можно ли все трое за один раз?

 SELECT item_id, operation, COUNT(*) FROM stats WHERE operation IN ('view','purchase','download') GROUP BY item_id, operation 

Вернет таблицу с одной строкой в ​​item_id и операцию , содержащую три столбца: item_id, тип операции и количество строк с этим item_id.

 1 view 3 1 purchase 5 2 download 7 3 download 1 

Вы можете опустить WHERE, если хотите все item_id, и можете заказывать в COUNT (*), чтобы получить самую популярную или что-то еще. Зависит от того, что вы ищете или как вы используете данные.

Если вам нужны столбцы рядом друг с другом , используйте IF:

 SELECT s1.item_id, SUM( IF( s1.operation = 'view', 1, 0 ) ) views, SUM( IF( s1.operation = 'download', 1, 0 ) ) downloads, SUM( IF( s1.operation = 'purchase', 1, 0 ) ) purchases FROM stats s1 GROUP BY s1.item_id item_id | views | downloads | purchases 1 | 3 | 0 | 5 2 | 0 | 7 | 0 3 | 0 | 1 | 0