2013-01-02 30 views
0

我有這兩個表:MySQL的選擇,加盟,比較日期失敗

DateRanges 

some_id start_date end_date 
--------------------------------- 
1   2012-12-01 2012-12-15 
1   2013-01-01 2013-01-15 
3   2013-01-03 2013-01-10 


Items 

id  name 
---------------- 
1  Some name 
2  Other name 
3  So on... 

我試圖做到的,是得到的,每個元素在Items表,最大start_date(忽略較小的日期/時間範圍該項目),並檢查當前的日期是在這個範圍內,將在未來的表(讓我們說今天的2013年1月2日):

id  name   TodayIsInTheRange 
--------------------------------------------- 
1  Some name    true 
2  Other name   false 
3  So on...    false 

我試圖獲得與一個查詢的第三個表:

SELECT A.*, (B.`start_date` <= CURRENT_DATE AND CURRENT_DATE <= B.`end_date`) AS `TodayIsInTheRange`            
FROM `Items` as A             
LEFT JOIN `DateRanges` as B ON            
A.id = B.some_id 
SORT BY B.`end_date` DESC 

但對於這個查詢我的項目重複自己,因爲我有兩個記錄DateRanges爲同一項目。

+0

是如何形成的題外話? – markus

回答

0

嘗試使用GROUP BYMAX功能。首先爲您提供只有一排每個item.id,第二個告訴你,如果你的範圍的至少一個日期

SELECT A.*, MAX(B.`start_date` <= CURRENT_DATE AND CURRENT_DATE <= B.`end_date`) AS `TodayIsInTheRange`            
FROM `Items` as A             
LEFT JOIN `DateRanges` as B ON            
A.id = B.some_id 
GROUP BY A.id 
ORDER BY B.`end_date` DESC 
1
select * from items join date_ranges dr0 on items.id = dr0.some_id 
    where start_date = 
     (select max(start_date) from date_ranges dr1 where dr0.some_id = dr1.some_id); 
2

我使用SQL Server,但我覺得這樣的事情應該是八九不離十:

SELECT 
    I.Id, 
    I.Name, 
    (DR.start_date <= CURRENT_DATE AND CURRENT_DATE <= DR.end_date) AS `TodayIsInTheRange` 
FROM `Items` AS I 
    LEFT JOIN 
     (SELECT Some_Id, MAX(Start_Date) as MaxStartDate 
     FROM `DateRanges` 
     GROUP BY Some_ID) AS HDR ON I.Id = HDR.Some_Id 
    LEFT JOIN `DateRanges` AS DR ON HDR.Some_Id = DR.Some_Id AND HDR.MaxStartDate = DR.Start_Date 
1
SELECT 
    a.*, 
    (b.start_date <= CURRENT_DATE 
    AND CURRENT_DATE <= b.end_date) AS TodayIsInTheRange 
FROM 
    Items AS a 
    LEFT JOIN 
    (SELECT some_id, MAX(start_date) AS start_date 
     FROM DateRanges 
     GROUP BY some_id 
    ) AS m 
    JOIN 
     DateRanges AS b 
     ON b.some_id = m.some_id 
     ON a.id = m.some_id 
ORDER BY b.end_date DESC ;