MySQL技术问题:如何筛选同时拥有Package 2和4的ID?
解决方法:筛选同时拥有Package 2和4的ID
你原来的查询select ID from Packages where Package = 2 and Package = 4之所以返回空结果,是因为单条记录里的Package字段不可能同时等于2和4——这个条件在任何情况下都不成立,自然查不到数据。下面给你几种可行的方案:
方案1:分组+Having(最常用的方法)
这种方法先筛选出目标Package的记录,再通过分组统计确保每个ID同时拥有两个Package:
SELECT ID FROM Packages WHERE Package IN (2, 4) -- 只保留Package为2或4的记录 GROUP BY ID HAVING COUNT(DISTINCT Package) = 2; -- 要求该ID有2种不同的目标Package
这里用COUNT(DISTINCT Package)是为了避免同一个ID多次收到同一个Package(比如你的数据里ID1有两条Package4的记录)导致计数错误,确保确实同时拥有2和4两种。
方案2:自连接
通过将表和自身连接,匹配同一个ID下分别包含Package2和4的记录:
SELECT DISTINCT p1.ID FROM Packages p1 JOIN Packages p2 ON p1.ID = p2.ID WHERE p1.Package = 2 AND p2.Package = 4;
DISTINCT用来去除重复的ID结果,因为同一个ID可能有多组匹配的记录。
方案3:子查询嵌套
先找出所有拥有Package4的ID,再从中筛选出同时拥有Package2的ID:
SELECT DISTINCT ID FROM Packages WHERE Package = 2 AND ID IN (SELECT ID FROM Packages WHERE Package = 4);
这种写法逻辑直观,适合理解基础子查询的场景。
这三种方法都能得到你想要的结果(ID1和ID2),可以根据你的数据量和实际场景选择使用。
内容的提问来源于stack exchange,提问作者Bingley
相关产品推荐
相关产品推荐

