我有一个包含两列的表格:entry_id
和cat_id
,其数据如下所示:
entry_id | CAT_ID
1个2
1个3
1个4
1个5
1个6
1 7
对于此示例,假设cat_id
被分为(2,3)
,(4,5)
,(6,7)
的任意组。
我正在使用以下查询:
SELECT DISTINCT
t1.entry_id
FROM
items t1
JOIN
items t2
ON
t2.entry_id = t1.entry_id
JOIN
items t3
ON
t3.entry_id = t1.entry_id
WHERE
t1.cat_id IN (2, 3)
AND
t2.cat_id IN (4, 5)
AND
t3.cat_id IN (6, 7)
返回entry_id
的{{1}}。
查询有效,但根据情况,自连接的数量将介于1到5之间。我正在寻找一种没有可变数量的自连接的解决方案 - 这可能吗?
答案 0 :(得分:2)
尝试:
select entry_id
from items
group by entry_id
having count(distinct case
when cat_id in (2,3) then 1
when cat_id in (4,5) then 2
when cat_id in (6,7) then 3
end) = 3
SQLFiddle here。
答案 1 :(得分:0)
从一个有点类似的问题回答,用户正在动态构建他的查询,并且不知道将应用多少标准。通过使JOIN和WHERE组合变得困难,但这种类似的改变使得它很容易实现......
SELECT DISTINCT
t1.entry_id
FROM
items t1
JOIN items t2
ON t1.entry_id = t2.entry_id
AND t2.cat_id IN (4, 5)
JOIN items t3
ON t1.entry_id = t3.entry_id
AND t3.cat_id IN (6, 7)
WHERE
t1.cat_id IN (2, 3)
where适用于类别的主要标准,然后是每个具有匹配键的连接,其标准将允许或不允许连接具有此类记录并提供您想要的结果...自动化只是构建JOIN / ON / AND组件,只需根据需要保持别名T2,T3,T4。