2010-02-09 112 views
11

這是我的問題。我有一個名爲'user_has_personalities'的多對多表。在我的應用程序中,用戶可以擁有許多個性,並且個性可以屬於許多用戶。MySQL多對多查詢問題

該表有兩個整數列user_id和personality_id。

我需要做的是讓所有至少具有所有我提供給查詢的個性(一組可變尺寸的personality_ids)的用戶。

舉個例子,我想讓所有擁有個性的用戶都擁有4,5,7,但也可以擁有其他個性。但是我需要查詢來爲可變數量的想要的人格標識工作,例如4,5,7,9,10。

任何想法?

回答

6

該查詢這項工作:

select user_id 
from user_has_personalities 
where personality_id in (<list-of-personality-ids>) 
group by user_id 
having count(*) = <numer-of-items-in-IN-list> 

您需要提供以逗號分隔的個性ID列表<list-of-personality-ids>,您還需要提供在日ELIST項目的數量。堅持你的榜樣,你會得到:

select user_id 
from user_has_personalities 
where personality_id in (4,5,7) 
group by user_id 
having count(*) = 3 

這確保你只有用戶擁有所有這些個性。

+0

這只是告訴他們是否擁有其中的一個personality_id。這個問題明確表示所有的ID。 – 2010-02-09 16:31:46

+0

@Evan:這個查詢告訴用戶是否擁有所有的ID。 – Quassnoi 2010-02-09 16:34:51

+0

我明白你在做什麼。尼斯。 – 2010-02-09 16:44:08

4
SELECT * 
FROM (
     SELECT DISTINCT user_id 
     FROM user_has_personalities 
     ) uhpo 
WHERE EXISTS 
     (
     SELECT NULL 
     FROM user_has_personalities uhpi 
     WHERE uhpi.user_id = uhpo.user_id 
       AND personality_id IN (4, 5, 6, 9, 10) 
     LIMIT 1 OFFSET 4 
     ) 

偏移值應比IN列表中的項目數量少1

如果你有一個專門的表格你的個性列表,使用此:

SELECT * 
FROM (
     SELECT DISTINCT user_id 
     FROM user_has_personalities 
     ) uhpo 
WHERE (
     SELECT COUNT(*) 
     FROM perslist p 
     JOIN user_has_personalities uhpi 
     ON  uhpi.user_id = uhpo.user_id 
       AND uhpi.personality_id = p.id 
     ) = 
     (
     SELECT COUNT(*) 
     FROM perslist 
     ) 

爲了讓它正確的(和快速)的工作,你需要有user_has_personalities (user_id, personality_id)一個UNIQUE指數(按照這個順序)。

如果你有一個users表,幾乎所有用戶在user_has_personalities記錄,然後用它替換到位DISTINCT嵌套查詢:

SELECT user_id 
FROM users uhpo 
WHERE (
     SELECT COUNT(*) 
     FROM perslist p 
     JOIN user_has_personalities uhpi 
     ON  uhpi.user_id = uhpo.user_id 
       AND uhpi.personality_id = p.id 
     ) = 
     (
     SELECT COUNT(*) 
     FROM perslist 
     ) 
+0

+1爲一般掌握和嚮導性:) Quassnoi,我愛你的博客,我把你連接起來。如果您打開對此的評論,我希望您的博客更多,但顯然它是您保留它的特權。無論如何,歡呼聲並繼續:) – 2010-02-09 21:12:09

+0

@Roland:類別'雜項'中的每篇文章都已啓用評論。 – Quassnoi 2010-02-09 21:34:40

+0

好,夠公平的:)謝謝。 – 2010-02-09 21:40:07

1
SELECT a.user_id 
FROM user_has_personalities a 
JOIN user_has_personalities b ON a.user_id = b.user_id AND b.personality_id = 5 
JOIN user_has_personalities c ON a.user_id = c.user_id AND b.personality_id = 7 
WHERE a.personality_id = 4 

這將是很容易產生這個名單以編程方式,但它不像提供一套一樣簡單。另一方面,它是有效的。