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

У меня есть система регистрации, которая сканирует сервер и каталогизирует всех пользователей, которые в данный момент находятся в сети. Вот как выглядит моя таблица:

-----------------
|    ab_logs    |
-----------------
|      id       |
|    scan_id    |
|  found_user   |
-----------------

id - первичный ключ с автоинкрементом. Не имеет никакой реальной ценности, кроме этой.

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

found_user. Сохраняет, какой пользователь был обнаружен в сети во время сканирования.

Приведенное выше сгенерирует таблицу, которая может выглядеть так:

id  |  scan_id  | found_user
----------------------------
1   |     1     |   Nick
2   |     2     |   Nick
3   |     2     |   John
4   |     3     |   John

Таким образом, при первом сканировании система нашла в сети только Ника. 2-го он нашел и Ника, и Джона. 3-го числа только Джон был в сети.


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

Из приведенного выше примера результат, который я хочу получить от sql, будет следующим:

1
2
2

РЕДАКТИРОВАТЬ:

Это то, что я пробовал до сих пор, но это неправильно:

SELECT COUNT(DISTINCT(found_user)) FROM ab_logs WHERE DATE(timestamp) = CURDATE() GROUP BY scan_id

То, что я пробовал, возвращает это:

1
2
1
1
Chris 24 Фев 2015 в 17:39

2 ответа

Лучший ответ

Приведенный ниже код должен дать вам результаты, которые вы ищете.

select s.scan_id, count(*) from
  (select distinct
    t.scan_id
    ,t1.found_user 
  from 
    tblScans t
    inner join tblScans t1 on t.scan_id >= t1.scan_id) s
group by
  s.scan_id;

Вот sqlFiddle
Предполагается, что имена уникальны и включает текущее и каждое предыдущее сканирование в счетчике.

2
kristof 24 Фев 2015 в 15:36

Попробуйте с группой по предложению:

SELECT scan_id, count(*)
FROM mytable
GROUP BY scan_id
2
SMA 24 Фев 2015 в 14:43