这是我的问题。我有一个名为'user_has_personalities'的多对多表。在我的应用程序中,用户可以拥有许多个性,个性可以属于许多用户。
该表有两个整数列,user_id和personality_id。
我需要做的是让所有至少拥有我提供给查询的所有个性(一组可变大小的个性化用户)的用户。
举个例子,我想让所有拥有ids 4,5,7个性的用户,但也可以拥有其他一些个性。但我需要查询来处理可变数量的通缉个性ID,例如4,5,7,9,10。
有什么想法吗?
答案 0 :(得分: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>
您需要为<list-of-personality-ids>
提供以逗号分隔的个性ID列表,并且您还需要提供优先级中的项目数。坚持你的榜样,你会得到:
select user_id
from user_has_personalities
where personality_id in (4,5,7)
group by user_id
having count(*) = 3
这可确保您只获得具有所有这些个性的用户。
答案 1 :(得分: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
)
偏移值应该1
小于IN
列表中的项目数。
如果您将个性列表放在专用表中,请使用:
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
)
为了使其正常(和快速),您需要UNIQUE
上的user_has_personalities (user_id, personality_id)
索引(按此顺序)。
如果您有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
)
答案 2 :(得分: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
以编程方式生成此列表很容易,但它并不像提供集合那么容易。另一方面,它是有效的。