2015-09-14 168 views
1

+日期條件我都在一個數據庫中的兩個表:活動日期,與他們之間的一個一對多的關係(1事件可以沿着許多日期)。加入SQL查詢

我想查詢數據庫,以獲得未來和過去的事件是這樣的:

  • 查詢得到未來事件應與日期> = CURDATE返回的每一個事件()和事件沒有指定的日期。 ...
  • 查詢得到往事應該只返回事件與分配至少一個日期應該是反過來,比CURDATE()年長...

我正在查詢數據庫使用一個簡單的連接,獲得適當的結果fot過去的事件(限制在不返回沒有日期的事件)。然而,對未來事件的查詢要稍微複雜一些,因爲沒有日期的事件也必須返回。我願意接受任何建議。

我嘗試至今:

過去事件(OK工作):

SELECT dates.*, events.*, 
FROM events 
JOIN dates on (events.eventID = dates.eventID AND dates.date < CURDATE()) 
GROUP BY events.eventID 
ORDER BY events.eventID ASC 

爲未來事件: ???

SELECT dates.*, events.*, 
FROM events 
LEFT JOIN dates on (events.eventID = dates.eventID AND dates.date >= CURDATE()) 
GROUP BY events.eventID 
ORDER BY events.eventID ASC 

(我知道我試着用LEFT JOIN是無效的,因爲它也返回過去的事情,凡是不注日期的信息(每場清零))。

在此先感謝。

+0

如果你只需要對未來事件的明確你可以移動'dates.date> = CURDATE()'爲having子句 –

+0

不,我需要未來的+非日期事件。 – andcl

+3

在這種情況下,您需要在連接之後應用過濾器,以便將anddate.date> = curdate()移動到where子句並且add或dates.date爲空。 'where(dates.date> = curdate()OR dates.date爲null)'不經常我看到這個需求,但仍然 – xQbert

回答

1

首先,在您擺放它們時,您的查詢不需要GROUP BY子句,因爲沒有進行聚合(沒有count,max等)。

你必須分開 「加入邏輯」 與 「條件邏輯」,所以我建議:

往事:

SELECT dates.*, events.* 
FROM events 
JOIN dates on (events.eventID = dates.eventID) 
WHERE dates.date < CURDATE() 
ORDER BY events.eventID ASC 

未來事件:

SELECT dates.*, events.* 
FROM events 
LEFT JOIN dates on events.eventID = dates.eventID 
WHERE dates.date >= CURDATE()) OR dates.date IS NULL 
ORDER BY events.eventID ASC 
+0

非常感謝。這正是我需要的。 – andcl

0

如果在一個記錄事件表將始終在日期表中有記錄,那麼您可以使用

SELECT dates.*, events.*, 
FROM events 
JOIN dates on (events.eventID = dates.eventID AND NVL(dates.date, CURDATE()) >= CURDATE()) 
GROUP BY events.eventID 
ORDER BY events.eventID ASC 

我猜我不明白爲什麼過去的事件也沒有日期。

0

我甚至沒有看過「過去的事件」的查詢,因爲你說它確定。

對於未來事件的一個,嘗試這樣的事情:

SELECT 
    `events` . *, `dates` . *, MAX(`dates`.`date`) as `maxDate` 
FROM 
    `events` AS `events` 
     LEFT JOIN 
    `dates` AS `dates` ON (`events`.`eventID` = `dates`.`eventID`) 
GROUP BY `events`.`eventID` 
HAVING `maxDate` >= CURDATE() 
    OR `dates`.`date` IS NULL 
ORDER BY events.eventID ASC;