0

我有一个包含两列的表:entry_idcat_id,其数据如下:

entry_id | cat_id
1 2
1 3
1 4
1 5
1 6
1 7

对于这个例子,假设cat_ids 被分成任意组(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_id1

该查询有效,但根据具体情况,自联接的数量将在 1 到 5 之间。我正在寻找一个没有可变数量的自连接的解决方案 - 这可能吗?

4

2 回答 2

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在这里

于 2013-05-28T16:47:04.937 回答
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。

于 2013-05-28T17:04:52.097 回答