2013-12-08 6 views
1

У меня есть таблица с start_date и end_date временными метками, строки содержат данные из таблицы учета радиуса.MySQL одновременный выбор из строк

В кратчайшие сроки, когда пользователь входит в систему, строка вставляется с отметкой времени start_date, и как только пользователь выходит из системы, end_date заполняется UPDATE.

Вот несколько строк:

ID    | start_date   | end_date 
22    2013-11-19 12:00:22  2013-11-20 14:20:22 (*) 
23    2013-11-19 12:02:22  2013-11-20 15:20:22 (*) 
23    2013-11-19 17:02:22  2013-11-20 20:20:22 
24    2013-11-20 12:06:22  2013-11-20 15:20:22 * 
25    2013-11-20 12:40:22  2013-11-20 15:23:22 * 
26    2013-11-20 12:50:22  2013-11-20 17:23:22 * 
27    2013-11-20 16:56:22  2013-11-20 17:29:22 
28    2013-11-20 17:58:22  2013-11-20 20:24:22 

Таким образом, в этом случае, 2013-11-19 максимальное число пользователей, одновременно является 2 (отмеченные звездочкой (*)) (их время между началом и концом перекрытия), для 2013-11-20 это 3 (помечено *)

Я пытаюсь написать SQL-запрос, чтобы получить число большинства одновременных пользователей за один день (в зависимости от даты начала и окончания) поэтому короткий результат будет заключаться в том, что в 2013-08-12 наиболее онлайн в то же время является числом xx.

Я мог бы сделать это на PHP, анализируя ряд за строкой, но я хотел бы сохранить его как SQL-запрос.

+0

Посмотрите в 'GROUP BY' и 'DAY (date)' для извлечения дневной части даты с помощью 'COUNT (*)' вы можете показать количество вхождений. Невозможно дать полный запрос, хотя (для меня), не зная структуру таблицы. – skiwi

+0

Отметьте это сообщение в StackOverflow: http://stackoverflow.com/questions/1764881/mysql-getting-data-for-histogram-plot Некоторые идеи могут пригодиться. – GregD

ответ

2

Попробуйте

select d, count(*) as user_count 
from 
(
    select start_date as d from your_table 
    union all 
    select end_date as d from your_table 
) x 
group by d 
order by user_count desc 
0

Вы можете рассчитать количество одновременно работающих пользователей на каждой точке данных у вас есть (start_date/end_date), а затем вычислить максимум из того, что:

select max(cnt) 
from (
    select q.t, count(*) as 'cnt' 
    from (
    select start_date as 't' 
    from log 
    where start_date between YOUR_START_DATE and YOUR_END_DATE 
    union 
    select end_date 
    from log 
    where end_date between YOUR_START_DATE and YOUR_END_DATE 
) as q 
    join log l on q.t between l.start_date and l.end_date 
    group by q.t 
) a 
Смежные вопросы