MySQL查询所有托盘百分比均为0的打印机问题求助
MySQL查询所有托盘百分比均为0的打印机问题求助
我明白你现在的需求啦——你想找出那些三个托盘(Tray1、Tray2、Tray3)的百分比全都是0的打印机,但目前的SQL会把只要有一个托盘是0的打印机都拉出来,比如Printer_2明明Tray2是50,却也被返回了,这肯定不是你想要的结果对吧?
你的原查询问题出在:它只是筛选出了「存在至少一个符合条件(托盘是1/2/3且百分比为0)的记录」,然后返回这些记录对应的打印机,完全没考虑该打印机的其他托盘状态。要实现你的需求,我们需要确保某台打印机的所有三个目标托盘的百分比都是0,可以用下面两种常用方法:
方法一:GROUP BY + HAVING 子句(推荐,简洁高效)
这种方法通过分组统计来验证所有托盘的状态,适合数据完整性较好的场景(比如每个打印机都一定有三个托盘的记录):
SELECT Printer FROM table1 WHERE Tray IN ('Tray1', 'Tray2', 'Tray3') GROUP BY Printer HAVING SUM(CASE WHEN Percentage != '0' THEN 1 ELSE 0 END) = 0 AND COUNT(DISTINCT Tray) = 3;
- 第一步
WHERE Tray IN (...)先过滤出我们关心的三个托盘的记录; GROUP BY Printer按打印机分组后,SUM(CASE...) = 0确保该分组下没有任何一个托盘的百分比非0;COUNT(DISTINCT Tray) = 3是额外的严谨性校验,确保该打印机确实存在三个托盘的记录,避免出现某台打印机只有1-2个托盘且都是0的情况(如果你的业务里每个打印机必然有三个托盘,这部分可以去掉)。
方法二:NOT EXISTS 子查询
这种方法用反向排除的思路,找出「不存在任何一个目标托盘百分比非0」的打印机,逻辑更直观:
SELECT DISTINCT t1.Printer FROM table1 t1 WHERE NOT EXISTS ( SELECT 1 FROM table1 t2 WHERE t2.Printer = t1.Printer AND t2.Tray IN ('Tray1', 'Tray2', 'Tray3') AND t2.Percentage != '0' ) AND EXISTS ( SELECT 1 FROM table1 t3 WHERE t3.Printer = t1.Printer AND t3.Tray IN ('Tray1', 'Tray2', 'Tray3') GROUP BY t3.Printer HAVING COUNT(DISTINCT t3.Tray) = 3 );
- 外层的
NOT EXISTS会排除掉所有「存在至少一个目标托盘百分比非0」的打印机; - 第二个
EXISTS同样是确保该打印机有完整的三个托盘记录,避免误判。
用这两种方法查询你的示例数据,都会只返回Printer_1,完全符合你的需求哦。
内容来源于stack exchange
相关产品推荐
相关产品推荐

