2008-10-29 204 views
2

我的每個客戶都可以有很多待辦事項,每個待辦事項都有到期日期。「簡單」SQL查詢

按照每個文件的截止日期查找下一個未完成待辦事項的查詢是什麼?如果客戶有多個待辦事項,則具有最低ID的那個是正確的。

假設下面的最小模式:

clients (id, name) 

todos (id, client_id, description, timestamp_due, timestamp_completed) 

謝謝。

+0

你還沒有說你正在使用哪個平臺 - 不同的平臺有不同的語法。 – Ross 2008-10-29 14:03:59

+0

我正在使用SQL Server,但我故意遺漏了它。我更喜歡直接的SQL解決方案。 – 2008-10-29 15:07:43

回答

3

我沒有測試過這個呢,所以你可能需要調整它:

SELECT 
    TD1.client_id, 
    TD1.id, 
    TD1.description, 
    TD1.timestamp_due 
FROM 
    Todos TD1 
LEFT OUTER JOIN Todos TD2 ON 
    TD2.client_id = TD1.client_id AND 
    TD2.timestamp_completed IS NULL AND 
    (
     TD2.timestamp_due < TD1.timestamp_due OR 
     (TD2.timestamp_due = TD1.timestamp_due AND TD2.id < TD1.id) 
    ) 
WHERE 
    TD2.id IS NULL 

而不是試圖梳理和彙總,你基本上回答這個問題,「是否有任何在這之前會有其他的待辦事項?「 (根據您對「之前」的定義)。如果不是,那麼這就是你想要的。

這應該在大多數SQL平臺上都有效。

-1

下面應該讓你關閉,首先獲得分鐘時間爲每個客戶端,然後查找客戶端/ TODO信息

SELECT 
    C.Id, 
    C.Name, 
    T.Id 
    T.Description, 
    T.timestamp_due 
FROM 
{ 
    SELECT 
     client_id, 
     MIN(timestamp_due) AS "DueDate" 
    FROM todos 
    WHERE timestamp_completed IS NULL 
    GROUP BY ClientId 
} AS MinValues 
    INNER JOIN Clients C 
    ON (MinValues.client_id = C.Id) 
    INNER JOIN todos T 
    ON (MinValues.client_id = T.client_id 
     AND MinValues.DueDate = T.timestamp_due) 
ORDER BY C.Name 

注:書面假設SQL服務器

2
SELECT c.name, MIN(t.id) 
FROM clients c, todos t 
WHERE c.id = t.client_id AND t.timestamp_complete IS NULL 
GROUP BY c.id 
HAVING t.timestamp_due <= MIN(t.timestamp_due) 

避免一個子查詢,相關或其他方式,但引入了一堆並不好得多的聚合操作。

+0

使用sqlite語法,但沒有什麼特別的。 – 2008-10-29 14:10:30

3

這個問題是經典的每個組別的挑選者。它每天發佈兩次。

SELECT * 
FROM todos t 
WHERE t.timestamp_completed is null 
    and 
(
    SELECT top 1 t2.id 
    FROM todos t2 
    WHERE t.client_id = t2.client_id 
    and t2.timestamp_completed is null 
    --there is no earlier record 
    and 
    (t.timestamp_due > t2.timestamp_due 
     or (t.timestamp_due = t2.timestamp_due and t.id > t2.id) 
    ) 
) is null 
0

一些Jet SQL,我意識到這是不太可能的問題是使用Jet,但讀者可能會。

SELECT c.name, t.description, t.timestamp_due 
FROM (clients c 
     INNER JOIN 
     (SELECT t.client_id, Min(t.id) AS MinOfid 
      FROM todos t 
      WHERE t.timestamp_completed Is Null 
      GROUP BY t.client_id) AS tm 
ON c.id = tm.client_id) 
INNER JOIN todos t ON tm.MinOfid = t.id