Mysql 自联接一个表以创建“的最简单方法”;和过滤器;?
我有下表(非常简单): 现在,我想按Z筛选该表中的值,并查找与我的筛选器匹配的所有值。 Z过滤器的行为应类似于AND过滤器。以下是一些匹配查询的示例: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
-- 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