Запрос MySQL - подсчитайте, сколько пользователей зарегистрировано на мероприятии (мужчины и женщины)

Я новичок в MySQL, и мне нужно написать запрос, чтобы выбрать все строки из таблицы событий и подсчитать, сколько пользователей зарегистрировано в этом событии (но мне нужно разделить пользователей по полу).

Мои столы:

событие за столом:

id
event_name
...and another insignificant column

пользователь таблицы:

id
username
gender (allowed values: male or female)
...and another insignificant column

таблица user_on_event:

event_id (link to event table to column ID)
user_id (link to user table to column ID)

и этот запрос:

SELECT *, COUNT(user_on_event.user_id) as total_registred_users_on_event FROM event LEFT JOIN user_on_event ON user_on_event.event_id = event.id

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

Что мне изменить в моем запросе, чтобы добиться этого?


person tomasnikl    schedule 31.10.2014    source источник


Ответы (3)


select 
    sum(gender = 'male') male_count,
    sum(gender = 'female') female_count,
    count(*) total_count
from user_on_event uoe
join user u on u.id = uoe.user_id

если вы хотите подсчет для определенного события, добавьте

where uoe.event_id = :event_id
person FuzzyTree    schedule 31.10.2014

SELECT event.id, event_name, gender, COUNT(*) from event 
INNER JOIN user_on_event ON event_id = event.id
INNER JOIN user ON user.id = user_id
GROUP BY event.id, event_name, gender

этот запрос сканирует таблицу только один раз, а не 3 раза, если вы выполните Select count дважды + select *. Но вы увидите 1-2 строки для каждого события, одну для мужчин и одну для женщин.

person Steve    schedule 31.10.2014

может быть, я понял :) этот запрос выглядит нормально? что ты думаешь?

SELECT *, COUNT(user_on_event.user_id) as total_registred_users_on_event,
(SELECT COUNT(user.id) FROM user WHERE user.id = user_on_event.user_id 
AND user.gender = "male") as men, 
(SELECT COUNT(user.id) FROM user 
WHERE user.id = user_on_event.user_id 
AND user.gender = "female") as women FROM event 
LEFT JOIN user_on_event ON user_on_event.event_id = event.id;
person tomasnikl    schedule 31.10.2014