У меня есть таблица с 2 рядами, скажем, «пользователь» и «действие». это выкладывается как таковое —
user | action
bob page view
mike detail view
bob page view
mike page view
bob detail view
Я хотел бы сгруппировать запрос по пользователю и посчитать каждое вхождение действия для указанного пользователя следующим образом:
bob = (2) page views (1) detail view
mike = (1) page view (2) detail views
Я пробовал group by, но он ограничивает каждый запрос до 1, так как он группируется следующим образом:
$sql = "SELECT * FROM table GROUP BY user";
а затем с помощью операторов if —
if($action == 'page view'){
$pv++;
}
Я знаю, что есть правильный способ сделать это в заявлении без использования операторов if, но не уверен, как … Спасибо!
Вы можете сделать это в SQL напрямую:
SELECT user, action, count(*) as total
FROM table
GROUP BY 1, 2
Если вы хотите, чтобы ядро базы данных возвращало общее количество страниц / подробное представление для каждого пользователя в одной строке, вам придется использовать условный оператор ветвления. Следующий запрос вернет всех ваших пользователей вместе с их просмотрами страниц и подробными представлениями:
SELECT user,
SUM(CASE WHEN action = 'page view' THEN 1 ELSE 0 END) AS page_view,
SUM(CASE WHEN action = 'detail view' THEN 1 ELSE 0 END) AS detail_view
FROM table
GROUP BY user;
Да, возможно, sql может сделать это напрямую
Select user,count(*),(distinct action) from table group by user