2012-10-15 87 views
0

表 「argument_user」MySQL的 - IN操作符(與精確值)

+-------------+----------+ 
| argument | user_id | 
+-------------+----------+ 
| bike  | 1  | 
| flower  | 2  | 
| web   | 1  | 
| web   | 2  | 
| nature  | 1  | 
| nature  | 2  | 
| nature  | 3  | 
+-------------+----------+ 

我想只得到共同的參數與用戶1和2 >> 「網絡」(不 「自然」)

+-------------+ 
| web   | 
+-------------+ 

現在我正在使用此查詢,但它是錯誤的,因爲它會返回我「web」和「house」。

select argument from argument_user 
where user_id in ('1','2') 
group by argument having count(distinct(user_id)) = 2 

+-------------+ 
| web   | 
| nature  | 
+-------------+ 

我想和同一張桌子做一個連接,但是我認爲這會讓用戶感覺太重了!你不是嗎? 所以,很多「user_id」使用的東西很簡單。

+1

它看起來像你已經實現這一點。用戶1和2都具有「自然」和「網絡」; –

+0

我想只有「網絡」。只有user_id 1和2. 的唯一參數user_id 3也遵循自然。我不想這樣的說法:) – ehijon

回答

0

使用一對夫婦的JOIN的

SELECT * 
FROM argument_user a 
INNER JOIN argument_user b 
ON a.argument = b.argument 
LEFT OUTER JOIN argument_user c 
ON a.argument = c.argument 
AND c.user_id NOT IN (1,2) 
WHERE a.user_id = 1 
AND b.user_id = 2 
AND c.user_id IS NULL 
+0

謝謝你,但我測試過,它不起作用... – ehijon

+0

修改它。現在試試吧 – Kickstart

+0

謝謝。這工作! – ehijon

0

假設user_id已編入索引,無論您添加到表中的用戶數有多少,WHERE子句中的IN都會使此查詢更快。

我會使用一個表格連接到自己vs有disticnt。再次,WHERE中的IN子句將使得由聯接處理的實際評估集非常小(假設您的聲明中沒有數百個用戶)!

另外,如果user_id是整數,則不要qoute他們在你的IN子句中 - 這是一個不必要的類型轉換。

+0

是的,user_id是索引但是一個字符串,我只是爲了簡單起見,它只是一個簡短的數字。 你可以請寫我和連接的例子,有更多的user_id獨特? – ehijon

0

試試這個:

select argument,count(*) from table1 
where user_id in ('1','2') 
and argument not in(select argument from table1 group by argument having count(*) <> 2) 
group by argument 
having count(*)=2 

SQL FIDDLE DEMO

+0

這個例子和我的請求一樣,但沒有user_id的值... 它不能正常工作,如果我添加一個「where」這樣的: WHERE user_id IN('1','2') 我想只取某些用戶之間共同參數的確切值(ex,1 e 2) – ehijon

0

該SQL查詢將很好地幫助你

select * 
from (
(
    select argument 
     ,GROUP_CONCAT(user_id order by user_id) as user_id 
    from argument_user 
    group by argument 
    ) as TEMP 
) 
group by argument 
having user_id = '1,2';