2013-10-25 2 views
3
CREATE TABLE `connectionLog` (
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    `serverTimeConnected` datetime NOT NULL, 
    `serverTimeDisconnected` datetime NOT NULL, 
    PRIMARY KEY (`ID`) 
); 

с этим запросом я получаю все идентификаторы, где serverTimeConnected находится через один час.GROUP BY диапазон дат

SELECT HOUR(`serverTimeConnected`) as STUNDE, 
    count(`ID`) as HITS 
FROM `connectionLog` 
GROUP BY HOUR(`serverTimeConnected`) 

, но мне нужны все идентификаторы между serverTimeConnected и serverTimeDisconnected.

ID serverTimeConnected serverTimeDisconnected 
1 10:00:00   10:10:00  
2 10:00:00   11:10:00  
3 10:00:00   12:10:00 

Мне нужен результат - как

STUNDE HITS 
10,  3 
11,  2 
12,  1 

ответ

0

Как насчет group_concat

SELECT HOUR(`serverTimeConnected`) as STUNDE, 
     count(`ID`) as HITS, 
     group_concat(id) as IDs 
FROM `connectionLog` 
GROUP BY HOUR(`serverTimeConnected`) 
+0

просто примечание. 'Результат [group_concat] усечен до максимальной длины, который задается системной переменной group_concat_max_len, которая имеет значение по умолчанию 1024' –

+1

. Я думаю, что это не ответ на вопрос. –

1

UPDATE: Я нашел это решение

SELECT Stunden.ID, COUNT(Stunden.ID) as HITS FROM Stunden 
INNER JOIN connectionLog cl 
    ON (
    (ADDTIME(DATE_FORMAT(cl.serverTimeConnected,'%Y-%m-%d 00:00:00'),CONCAT(Stunden.ID,":00:00")) 
     BETWEEN cl.serverTimeConnected AND cl.serverTimeDisconnected) 
    OR 
     (ADDTIME(DATE_FORMAT(cl.serverTimedisConnected,'%Y-%m-%d 00:00:00'),CONCAT(Stunden.ID,":00:00")) 
     BETWEEN cl.serverTimeConnected AND cl.serverTimeDisconnected) 
    ) 

GROUP BY Stunden.ID 

http://sqlfiddle.com/#!2/6f3b0/11 (обновлено)

Таблица Stunden - это список всех доступных часов. Простой INNER JOIN, когда час между соединением и отключением (с учетом дня), получите нам количество совпадений, которое мы ищем. Затем Group by часов и мы сопоставляем правильные HITS.

+0

Спасибо, INNER JOIN - классная идея! – user2919923

+0

[http://sqlfiddle.com/#!2/3a1ab/1/0](http://sqlfiddle.com/#!2/3a1ab/1/0) работает. Но у меня есть другая проблема: serverTimeConnected = "2013-08-20 23:00:00" и serverTimeDisconnected = "2013-08-21 01:10:00" – user2919923

+0

Я обновил ответ. Обратите внимание, что это простой запрос. Может быть, более чисто, чтобы использовать процедуру хранения или функцию и избегать таблицы Stunden. –

-1
+1

Хотя указание OP на возможное решение может быть полезным, предпочтительный код или выборки являются предпочтительными. – Kermit

+0

Хороший аргумент. Но это полезная подсказка! – Pateta

Смежные вопросы