2015-04-27 21 views
0

我有一個事件表,每個都有負責人。這些事件每天可能有多個,但我需要在給定日期爲每個用戶提供第一個的查詢記錄。MySQL:在給定的日子裏獲取用戶的最低記錄

舉例來說,如果我有事件如下表:

+----------+-------------+---------------------+ 
| event_id | director_id | event_start   | 
+----------+-------------+---------------------+ 
|  1 |   111 | 2015-04-27 10:00:00 | 
+----------+-------------+---------------------+ 
|  2 |   222 | 2015-04-27 11:00:00 | 
+----------+-------------+---------------------+ 
|  3 |   333 | 2015-04-27 12:00:00 | 
+----------+-------------+---------------------+ 
|  4 |   111 | 2015-04-27 13:00:00 | 
+----------+-------------+---------------------+ 
|  5 |   222 | 2015-04-27 09:00:00 | 
+----------+-------------+---------------------+ 

我想下面返回:

+----------+-------------+---------------------+ 
| event_id | director_id | event_start   | 
+----------+-------------+---------------------+ 
|  1 |   111 | 2015-04-27 10:00:00 | 
+----------+-------------+---------------------+ 
|  5 |   222 | 2015-04-27 09:00:00 | 
+----------+-------------+---------------------+ 
|  3 |   333 | 2015-04-27 12:00:00 | 
+----------+-------------+---------------------+ 

我覺得像下面這樣的查詢會工作,但它事實證明,MySQL在WHERE子句(simple SQL query giving Invalid use of group function)中不支持MIN

SELECT 
     event_id, director_id, MIN(event_start) AS event_start 
    FROM events 
    WHERE MIN(event_start) >= '2015-04-27 00:00:00' 
     AND MIN(event_start) < '2015-04-28 00:00:00' 
    GROUP BY director_id; 

我該如何以最有效的方式做到這一點?我的events表格可能很容易擁有10,000-100,000條記錄。

+0

爲什麼不使用'WHERE event_start ='2015-04-27 00:00:00''?因爲'value> = 1 AND value <2'導致'value = 1'!? – C4u

+0

請點擊此鏈接: http://stackoverflow.com/questions/17938384/mysql-min-in-where-clause – Sagar

+0

@ C4ud3x事件可以在任何時候開始。第一個不確定從午夜開始。 – Bing

回答

2

你可以在每一天最短的事件時間與你類似的查詢:

SELECT director_id, date(event_start) as dte, MIN(event_start) AS event_start 
FROM events e 
GROUP BY director_id, date(event_start); 

然後,您可以使用它作爲一個子查詢,以獲得從該行的所有其他信息:

select e.* 
from events e join 
    (SELECT e.director_id, date(e.event_start) as dte, MIN(e.event_start) AS event_start 
     FROM events e 
     GROUP BY e.director_id, date(e.event_start) 
    ) ee 
    on e.event_start = ee.event_start -- note, this has both the date and time; 

如果您想限制結果爲一天,您可以將where子句置於子查詢中。

0

你不能在查詢的where子句中使用group by/aggregate函數。做你想做的一種方法是使用一個左連接,像這樣:

select e1.* 
    from events e1 
    left join events e2 
     on e1.director_id = e2.director_id 
     and e1.event_start > e2.event_start 
     and date(e1.event_start) = date(e2.event_start) 
    where e2.director_id is null 

fiddle here

性能很可能要增加,如果你有跨(director_id, event_start)

索引您還可以進一步限制通過更改and date(e1.event_start) = date(e2.event_start)來檢查特定日期的結果大小。

+0

舊學校。不錯,但我們不會這樣做,不再這樣做。性能是一個殺手。 – Strawberry

+0

我不能誠實地說我曾經把它與子查詢加入進行比較 - 它只是有更好的美學! –

0

你可以試試這個:

SELECT 
    e1.* 
FROM events AS e1 
    INNER JOIN (SELECT director_id, MIN(event_start) AS `eventStart` 
       FROM `events` GROUP BY director_id) AS e2 
    ON e1.director_id = e2.director_id 
    AND e1.event_start = e2.eventStart 
WHERE e2.eventStart >= '2015-04-27 00:00:00' 
    AND e2.eventStart < '2015-04-28 00:00:00'; 

這裏是sqlfiddle

+0

沒有。您無法按director_id分組,然後在您選擇的字段中隨意添加event_id。 –

+0

@pala_我已更新我的查詢。 – Beginner

相關問題