我可以通过删除连接来简化此查询吗?

时间:2013-05-28 16:39:35

标签: mysql

我有一个包含两列的表格:entry_idcat_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之间。我正在寻找一种没有可变数量的自连接的解决方案 - 这可能吗?

2 个答案:

答案 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。