Как правильно добавить 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 шт):

Автор решения: Denis I
SELECT DISTINCT * FROM sessions WHERE uid > 0
→ Ссылка
Автор решения: Aziz Umarov

Игнорим мультсессии значит не выводим их

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 ....
→ Ссылка
Автор решения: Mike

Если я правильно понял, что вам нужно:

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 значения из совершенно разных плоскостей и между собой никак пересекаться не могут. Если могут - то добавьте к сессии какой нибудь префикс, например.

→ Ссылка
Автор решения: Novitskiy Denis

Если решение 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);

Фиддл

→ Ссылка