我想寫一個查詢,其中給出了一個用戶列表的名稱(爲前)「喜歡」,我想選擇所有那些用戶都有一個0和「喜歡」欄的1。該模式看起來是這樣的:查詢根據列條件返回行
id Name Likes
0 Tom 1
1 Alice 0
2 Tom 0
查詢應使用id = 0和id返回行= 2,因爲湯姆既有1,爲柱狀0。什麼是最簡單/最有效的查詢來完成這種行爲?
我想寫一個查詢,其中給出了一個用戶列表的名稱(爲前)「喜歡」,我想選擇所有那些用戶都有一個0和「喜歡」欄的1。該模式看起來是這樣的:查詢根據列條件返回行
id Name Likes
0 Tom 1
1 Alice 0
2 Tom 0
查詢應使用id = 0和id返回行= 2,因爲湯姆既有1,爲柱狀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
子句中枚舉它們,並將子選擇與數值進行比較。
如果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
我明白你的想法,但你應該加入,我想。 –
@ peter.petrov我不明白你爲什麼想加入。順便說一句:許多數據庫優化器像外連接一樣處理子查詢,在這種情況下 - 如果表中有記錄 - 則外連接的「外層」永遠不會發生。 – FrankPl
好的,可以。只要確保你這樣做是有目的的。 –