Как правильно добавить DISTINCT в MySQL запрос
Есть запрос на подсчёт количества активных сессий из таблицы:
SELECT count(*) FROM sessions WHERE last_active >= DATE_SUB(NOW(), INTERVAL 15 MINUTE);
В таблице существует поля SESSIONID, uid, last_active. В поле uid содержится ID аккаунта. Во всех остальных случаях (гость, поисковый бот) оно равно нулю. Подскажите, как правильно добавить DISTINCT чтобы отбросить из статистики мультисессии пользователей и засчитывать их как одну, по условию когда uid > 0?
Ответы (4 шт):
Игнорим мультсессии значит не выводим их
Select distinct uid from sessions where uid>0
А на самом деле лучше сгруппировать и получить ещё количество сессий
Select uid, count(*) from sessions where uid>0 group by uid
Я только гадаю, возможно так вы хотите
SELECT count(distinct uid) FROM sessions WHERE last_active >= DATE_SUB(NOW(), INTERVAL 15 MINUTE) and uid >0
Хотите можно и по сложнее
Select count( distinct case when uid>0 then uid else null end) from ....
Если я правильно понял, что вам нужно:
SELECT count(distinct if(uid!=0, uid, SESSIONID) )
FROM sessions
WHERE last_active >= DATE_SUB(NOW(), INTERVAL 15 MINUTE);
Т.е. для uid не равных 0 считаем количества уникальных uid, а для равных 0 считаем количества уникальных сессий.
И работает корректно в случае если uid и SESSIONID значения из совершенно разных плоскостей и между собой никак пересекаться не могут. Если могут - то добавьте к сессии какой нибудь префикс, например.
Если решение Mike не подходит, можно использовать вот этот запрос
select count(case when uid=0 then uid end)+
count( distinct case when uid!=0 then uid end)
FROM sessions
WHERE last_active >= DATE_SUB(NOW(), INTERVAL 15 MINUTE);