MySQL находит дубликаты + еще одно поле

Я работаю с сервером freeradius с серверной частью MySQL и пытаюсь выбрать зарегистрированных пользователей из таблицы radacct. Таблица выглядит так:

╔══════════╦═══════════════╦═════════════════════╦═════════════════════╗
║ USERNAME ║ ACCTSESSIONID ║    ACCTSTARTTIME    ║    ACCTSTOPTIME     ║
╠══════════╬═══════════════╬═════════════════════╬═════════════════════╣
║ test2    ║ 00000051      ║ 2013-09-06 15:44:05 ║ 2013-09-06 15:44:26 ║
║ jason    ║ 00000057      ║ 2013-09-06 15:44:56 ║ 2013-09-06 15:46:08 ║
║ jason    ║ 00000058      ║ 2013-09-06 15:44:56 ║ 2013-09-06 15:46:08 ║
║ test1    ║ 00000059      ║ 2013-09-06 15:44:57 ║ 2013-09-06 15:46:08 ║
║ test1    ║ 0000005A      ║ 2013-09-06 15:44:57 ║ 2013-09-06 15:46:08 ║
║ test2    ║ 0000005B      ║ 2013-09-06 15:44:57 ║ 2013-09-06 15:46:08 ║
║ jason    ║ 00000061      ║ 2013-09-06 15:46:39 ║ NULL                ║
║ jason    ║ 00000062      ║ 2013-09-06 15:46:39 ║ NULL                ║
║ test1    ║ 00000063      ║ 2013-09-06 15:46:39 ║ NULL                ║
║ test1    ║ 00000064      ║ 2013-09-06 15:46:39 ║ NULL                ║
║ test2    ║ 00000065      ║ 2013-09-06 15:46:39 ║ NULL                ║
╚══════════╩═══════════════╩═════════════════════╩═════════════════════╝

Каждая строка представляет собой сеанс входа в систему, строки, где «acctstoptime» имеет значение null, считаются активными. Я пытаюсь получить имя пользователя и acctsessionid для каждого имени пользователя, имеющего более 1 строки с нулевым значением acctstoptime.


person jasondewitt    schedule 09.09.2013    source источник


Ответы (2)


Вот один из способов получить указанный результат:

SELECT s.username
     , s.acctsessionid
  FROM (
         SELECT r.username
           FROM radacct r 
          WHERE r.acctstoptime IS NULL
          GROUP BY r.username
         HAVING COUNT(1) > 1
       ) d
  JOIN radacct s
    ON s.username = d.username
 WHERE s.acctstoptime IS NULL
 ORDER
    BY s.username
     , s.acctsessionid
person spencer7593    schedule 09.09.2013

Попробуй это:

SELECT T1.USERNAME, 
       T1.ACCTSESSIONID 
FROM   (SELECT * 
        FROM   TABLEB 
        WHERE  ACCTSTOPTIME IS NULL) T1 
       INNER JOIN (SELECT USERNAME 
                   FROM   TABLEB 
                   WHERE  ACCTSTOPTIME IS NULL 
                   GROUP  BY USERNAME 
                   HAVING COUNT(*) > 1)T2 
               ON T1.USERNAME = T2.USERNAME 

Рабочий пример можно найти на SQL Fiddle.

Удачи!

person Gidil    schedule 09.09.2013