2013-07-07 52 views
0

我花了很多時間在網上搜索這個問題的答案,但我似乎無法提出任何有用的東西。如果語句在mySql查詢

我對mySQL非常陌生,所以我的知識有限。

我有一個表events有6列:idevent_nameevent_dateevent_close_timeevent_linkevent_image

我試圖從數據庫中選擇所有event_close_time爲<當前時間(如果今天是事件)並選擇未來所有其他事件。

我想出是:

SELECT * FROM `events` 
WHERE `event_date` >= 'todays_date' 
AND `event_close_time` > 'current_time' 
ORDER BY `event_date` 

但這並不做什麼我想它做的事。它返回當前或未來的所有事件,只要它們的關閉時間早於當前時間即可。

重要的是我在1個查詢中執行它,因爲最後的ORDER BY子句允許我按照我想要在我的Web應用程序中使用的順序排序事件。

任何人都可以指出我需要做出的調整來獲得所需的結果嗎?

+0

首先,你不是指'event_close_time>當前時間嗎?您不應該單獨存儲日期和時間,而是使用時間戳列,因此它是單個比較。目前存儲的日期/時間如何? –

+0

謝謝吉姆,你的權利。簡單的錯誤,那就是睡眠剝奪。 – Danny

回答

1

你應該有一個select和正確where條款做到這一點:

SELECT * 
FROM `events` 
WHERE (event_date = CURDATE() AND event_close_time < CURTIME()) or 
     (event_date > CURDATE()) 
ORDER BY `event_date`; 

使用unionunion all實現or邏輯是一個壞習慣進入。首先,它需要掃描events表兩次,每種情況一次。單個where只掃描一次表格。

+0

這就是你錯了的地方。 Union查詢通常會更好地優化,因爲where子句中的OR會自動導致MySQL中的FULL TABLE SCAN,因爲當您擁有OR時,它不能使用索引,而union聯合查詢只需運行2個可以使用的更優化的查詢索引。這可以通過運行解釋查詢來驗證。如果你自己嘗試這個,我保證如果表中有大量數據,UNION查詢會更快。 – Seth

+0

@Seth。 。 。我支持我的評論。當你指'或'時,使用'union'或'union all'是一個壞習慣。出於性能原因(例如使用索引)故意使用'union' /'union all * *,這很好。但是用它來表示「或」只是使查詢複雜化,使得它們很難維護,而且通常是不必要的。 –

+0

當然,這會讓查詢變得複雜。最佳做法通常比較困難。如果這是一個壞習慣,那爲什麼?編寫一個只查看錶的一小部分的UNION查詢與導致全表掃描的OR查詢明顯更好,原因很多。 OR查詢在許多情況下都可以正常工作,但如果要構建可擴展的應用程序,那麼一旦開始在表中創建更多數據時,任何OR查詢都將成爲首先出現性能問題的查詢。我知道這是因爲我設計並維護了一個支持數百個併發用戶的企業應用程序。 – Seth

0

這個怎麼樣?

SELECT * 
FROM events 
WHERE event_date = CURDATE() 
AND event_close_time < CURTIME() 
UNION ALL 
SELECT * 
FROM events 
WHERE event_date > CURDATE() 
ORDER BY event_date 

這也可以用一個OR代替UNION ALL完成,但我發現,工會往往更有效,因爲手術室事業指標沒有(至少在MySQL)中使用。

+0

謝謝很多塞思。這完全解決了我的問題!另外Jim對'event_close_time>當前時間是正確的。 – Danny

+0

沒問題,很樂意幫忙。 – Seth