2008-10-29 3 views
2

각 클라이언트에는 할 일 목록이 많으며 모든 할 일 목록에는 기한이 있습니다."Simple"SQL 쿼리

각 파일의 기한까지 다음 번 실행 취소 대상 항목을 검색하기위한 쿼리는 무엇입니까? 클라이언트에 할 일 목록이 여러 개있는 경우 가장 낮은 ID를 가진 것이 최선입니다.

다음과 같은 최소한의 스키마를 가정 :

clients (id, name) 

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

감사합니다.

+0

사용중인 플랫폼을 언급하지 않았습니다. 플랫폼마다 구문이 다릅니다. – Ross

+0

SQL Server를 사용하고 있지만 의도적으로 사용하지 않았습니다. 나는 솔직한 SQL 솔루션을 선호합니다. –

답변

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 

대신에 정렬하고 집계하는 노력, 당신은 기본적으로 질문에 대답하고있다 "거기에 어떤가요 이것 이전에 올 것 인 다른 todo? " ("이전"에 대한 귀하의 정의에 따라). 그렇지 않다면, 이것이 당신이 원하는 것입니다.

대부분의 SQL 플랫폼에서 유효해야합니다.

+0

이것은 이런 종류의 문제에 대한 가장 좋은 해결책입니다. 저는 SO 및 다른 뉴스 그룹에 여러 번 게시했습니다. 하위 쿼리, GROUP BY 및 공급 업체 독점 구문을 사용하지 않습니다. –

+0

나는 이것을 정말로 좋아한다. 감사. –

-1

다음해야 당신이 다음

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 구문을 사용하지만 특별한 것은 없습니다. –

+0

이 그룹은 이름 및 설명 열을 포함하지 않으므로 SQL Server에서는 작동하지 않습니다. –

+0

여기에서는 ID가 연대순을 나타내며이를 나타내지 않는다고 가정합니다. –

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

일부 제트 SQL, 나는 질문자가 제트를 사용하는 것 같지는 않다 실현, 그러나 독자가 될 수있다.

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