Mysql 自联接一个表以创建“的最简单方法”;和过滤器;?

Mysql 自联接一个表以创建“的最简单方法”;和过滤器;?,mysql,sql,filter,self-join,Mysql,Sql,Filter,Self Join,我有下表(非常简单): 现在,我想按Z筛选该表中的值,并查找与我的筛选器匹配的所有值。 Z过滤器的行为应类似于AND过滤器。以下是一些匹配查询的示例: -- filter z= 1 -- expect a = 1,2 select a from data where z = 1; -- filter z= 5 -- expect a = 2 select a from data where z = 5; -- filter z= - -- expect a = 1,2 select a fr

我有下表(非常简单):

现在,我想按Z筛选该表中的值,并查找与我的筛选器匹配的所有值。 Z过滤器的行为应类似于AND过滤器。以下是一些匹配查询的示例:

-- filter z= 1
-- expect a = 1,2
select a from data where z = 1;

-- filter z= 5
-- expect a = 2
select a from data where z = 5;

-- filter z= -
-- expect a = 1,2
select a from data;
现在问题来了:我想按z=1和z=5进行过滤

-- filter z: 1,5
-- expect a = 2
使用“in”不会得到我想要的结果。这就像说z=1或z=5

select a from data where z in (1,5);
我想要一个和加入z过滤器。我知道可以这样做:

select d1.a from data d1
  left join data d2 on (d1.a = d2.a)
  where d1.z = 1
  and d2.z = 5;
问题是z-filter-list可以动态增长,对于每个z-value,我必须添加另一个连接。所以我的问题是:有更简单的方法吗?


SQLFiddle上面的例子:

您可以使用
分组方式/have

SELECT  a
FROM    data 
WHERE   z IN (1,5)
GROUP BY a
HAVING COUNT(DISTINCT z) = 2; -- NUMBER OF ITEMS IN THE IN CLAUSE
因此,尽管您说的
z
可以是1或5,但您的
HAVING
将其限制为仅包含这两个值的
a


哦,你已经有了答案,很抱歉没有看到,删除我的答案是重复的。太棒了!我知道一定有别的办法。非常感谢D但是distinct的需要是什么。@siddhesh在问题中没有提到元组
(a,z)
被约束为唯一的,因此可以有两行值
(1,1),(1,1)
,这既满足了
z in(1,5)
又满足了
COUNT(z)=2
,但是,没有z=5的值,因此,不应退还。在没有明显区别的情况下对演示稍加修改后,查询在第二个查询中错误地返回3。谢谢@GarethD sir。今天我在办公室里一整天都在为这个问题疯狂,最后我认为自我加入是一个解决方案,所以我想到了加入的缺点,并再次研究了这个话题,找到了这个答案,非常高兴。请告诉我在哪里可以找到像这样的sql查询,以便进一步了解高级sql技巧。
SELECT  a
FROM    data 
WHERE   z IN (1,5)
GROUP BY a
HAVING COUNT(DISTINCT z) = 2; -- NUMBER OF ITEMS IN THE IN CLAUSE