2012-06-28 38 views
1

假設我們有字段:id |內容| updateTime | creationTime帶有條件的SQL查詢,其中一個字段不等於另一個字段

插入完成後,updateTime和creationTime都會被當前時間填充。在更新時,只有updateTime字段被更改。當我需要找到上創建的所有數據「2012-06-28」我簡單地使用:

SELECT id, content FROM tbl WHERE creationTime LIKE '2012-06-28%'` 

但要獲得不包括創建的數據已更新,我需要使用像這樣的所有數據:

SELECT id, content FROM tbl WHERE creationTime LIKE '2012-06-28%' AND creationTime != updateTime 

這顯然不起作用。雖然我可以通過比較php內兩個'時間'collumns的值來找到所有更新的數據,但我仍然喜歡在查詢內部完成它。

UPD:嗯,事實證明,我完全沒有意識到,sql不僅允許將字段的值與給定變量,數字進行比較......還可以將一個字段的值與另一個字段的值進行比較。

+0

創建於28日,並在28日編輯,但不是在創建它的同時?在更新之前保持updateTime爲null會更好嗎? –

+0

爲什麼你說「*這不能工作,顯然*」?我認爲它應該,雖然我同意@marabutt認爲'updateTime = NULL'可能更符合語義。 (另外,爲了匹配日期,你會發現'DATE(creationTime)='2012-06-28''會比你的字符串模式匹配方法更有效率)。 – eggyal

+0

@marabutt - INSERT每行只發生一次,UPDATE可能發生多次。所以我只是使用'updateTime'時間戳NOT NULL default CURRENT_TIMESTAMP - 這種方式'updateTime'由DB本身自動更新。我只需要記住在創建記錄時插入日期。 –

回答

5

使用<>代替!=(即不與一些DMBS兼容)

所以

SELECT id, content 
FROM tbl 
WHERE creationTime LIKE '2012-06-28%' AND creationTime <> updateTime 

如果你想要一些文檔you can find here

然而,查詢必須與!=正常工作

+0

@Hallucynogenyc:看看他使用的標籤 – DonCallisto

+0

抱歉,從來沒有用過mySQL,只是PostgreSQL,你怎麼知道的? :) – bluehallu

+0

您鏈接到的文檔表明'<>'和'!='是有效的不等式運算符。爲什麼你提出的改變會有所作爲? – eggyal

1

只將非運算符從!=更改爲<>

SELECT id, content FROM tbl WHERE creationTime LIKE '2012-06-28%' AND creationTime <> updateTime 
+0

不支持這兩種形式的不等式運營商? – eggyal

2

您所查詢的是正確的(上mySQL¹),不知道爲什麼你會認爲否則

¹<>是不相等的SQL操作。它的一些實現(例如PostgreSQL或MySQL)也接受!=。如果您曾在不同的數據庫上使用您的代碼,那麼始終使用<>以避免問題是一種很好的做法。

+0

不支持這兩種形式的不等式運算符嗎? – eggyal

+0

SQL規範與當今存在的實現之間存在差異。 MySQL可能支持不符合規範但不適用於其他SQL編譯數據庫的內容。 – bluehallu

+0

同意,但考慮到這個問題被標記爲[tag:mysql],這是如何回答OP的問題? – eggyal

相關問題