2011-09-07 42 views
2

我需要從數據庫中選擇只有一列具有特定值的所有行。也就是說,如果兩行具有「ABC」作爲其列arbitrary的值,那麼它們不會被返回。在單個查詢中從MySQL中選擇唯一值

我希望這足夠清楚的措辭,以瞭解我在問什麼。使用MySQL的DISTINCT關鍵字不適合我需要做的事情,因爲使用它需要多個查詢。我希望能夠在一個很好,緊湊的查詢中做到這一點,因爲它會被頻繁執行。我正在擴展我的應用程序以允許更高程度的併發性,而我現在的代碼不會再削減它了。

目前,我正在使用DISTINCT爲所涉及的列選擇每個唯一值,然後在另一個查詢中檢查這些值中的每一個以查看它們是否僅存在一次。如果是這樣,保留它,如果沒有,扔掉它。肯定有更謹慎的方式去做這件事?

謝謝。

回答

6
SELECT * FROM table1 
GROUP BY the_column_that_must_be_unique 
HAVING COUNT(*) = 1 

只選擇那些重複的值,然後僅僅是最近的,這樣我們就可以扔掉那些出去,讓撥打the_column_that_must_be_uniqueü短:-)

SELECT t1.* FROM table1 t1 
INNER JOIN table1 t2 ON (t1.u = t2.u AND t1.id > t2.id) 

注意我假設ID由一個自動遞增的整數ID,所以更大的ID意味着更新的項目。如果這不是真的比做

SELECT t1.* FROM table1 t1 
INNER JOIN table1 t2 ON (t1.u = t2.u AND t1.id <> t2.id) 
WHERE t1.atimestamp > t2.atimestamp 
+0

完美的,我從來沒有意識到之前,HAVING關鍵字。我會實現這一點,非常感謝! –

+0

'有'是一個適用於聚合的地方。它起作用的原因是它在**集合被評估後被調用**,所以它可以對它們進行測試,where子句不能,因爲它在**完全計算之前得到測試**。 – Johan

+0

如果這回答了你的問題,請檢查答案,以便Johan能夠收到他應得的分數,而其他讀者可以很容易地看出哪個答案解決了問題。 –

1
SELECT col1,col2,.... 
FROM table_name 
GROUP BY arbitrary 
HAVING COUNT(arbitrary) =1 
+0

+1,但'count(*)= 1'可能運行速度更快(並且永遠不會變慢) – Johan

+0

感謝您的信息:) – confucius