2014-01-23 67 views
1

我想寫一個查詢,其中給出了一個用戶列表的名稱(爲前)「喜歡」,我想選擇所有那些用戶都有一個0和「喜歡」欄的1。該模式看起來是這樣的:查詢根據列條件返回行

id Name Likes 
0 Tom 1 
1 Alice 0 
2 Tom 0 

查詢應使用id = 0和id返回行= 2,因爲湯姆既有1,爲柱狀0。什麼是最簡單/最有效的查詢來完成這種行爲?

回答

0

假設你的表稱爲tab,你可以使用:

SELECT * 
    FROM tab a 
WHERE (SELECT count(distinct b.likes) 
     FROM tab b 
     WHERE a.name = b.name 
      AND b.likes in(0, 1) 
     ) = 2 

這可以很容易地擴展到任意數量的要求不同喜好的。只需在IN子句中枚舉它們,並將子選擇與數值進行比較。

+0

我明白你的想法,但你應該加入,我想。 –

+0

@ peter.petrov我不明白你爲什麼想加入。順便說一句:許多數據庫優化器像外連接一樣處理子查詢,在這種情況下 - 如果表中有記錄 - 則外連接的「外層」永遠不會發生。 – FrankPl

+0

好的,可以。只要確保你這樣做是有目的的。 –

2

如果Likes在您的表中只能是1或0,那麼您可以這樣做。

select distinct t1.Name From tableName t1 
join tableName t2 on t1.name = t2.name and t1.Likes = 1 - t2.Likes 

如果情況並非如此,只是這樣做:

select distinct t1.Name From tableName t1 
join tableName t2 on t1.name = t2.name and t1.Likes = 1 and t2.Likes = 0 

另一種可能的解決方案是這一個。

select a.* from 
tableName a 
JOIN 
(
    select b.Name, count(distinct b.likes) as Likes 
    from tableName b 
    group by b.Name 
    having count(distinct b.likes) > 1 
) a1 on a.Name = a1.Name