使用ALL的MySQL子查询
相关模式: 因此,明显的关系是“服务”城市。我一直在努力让所有的快递员为“两个”城市服务,cname是A和B。 i、 e.可能的交叉口 我可以通过以下方式找到解决方法:使用ALL的MySQL子查询,mysql,subquery,Mysql,Subquery,相关模式: 因此,明显的关系是“服务”城市。我一直在努力让所有的快递员为“两个”城市服务,cname是A和B。 i、 e.可能的交叉口 我可以通过以下方式找到解决方法: select courname from courier where courid in (select courid from courierservice where cid=(select cid from city where cname='A')) and courid in (select courid fro
select courname from courier where courid in (select courid from courierservice
where cid=(select cid from city where cname='A')) and
courid in (select courid from courierservice where cid=(select cid from city where cname='B'));
但是这个看起来有点重
根据文档,它应该处理以下所有子查询:
select * from courier where courid in (select courid from courierservice
where cid = all (select cid from city where cname='A' or cname='B'));
但它返回的是一个空集
是否缺少某些内容?尝试将cid=all替换为中的cid,它应该可以正常工作。all返回一个集合。但当您使用“=”进行比较时,它会与元素进行比较。所以一个元素不能和一个集合相比较。如果您想知道该元素是否在集合中,则必须使用IN子句而不是“=”使用=ALL没有意义:单个courierservice.cid如何同时等于多个city.cid?ALL仅与可以匹配多个值的比较运算符一起使用,例如>=或:请参阅
但是,最好使用JOIN重写查询,使其更简洁、更高效:
SELECT courname FROM courier NATURAL JOIN (
SELECT courid
FROM courierservice JOIN city USING (cid)
WHERE cname IN ('A', 'B')
GROUP BY courid
HAVING SUM(cname='A') AND SUM(cname='B')
) t
西德给了我一个联盟。所有为A或B服务的快递员。我需要A和B,然后使用,而不是cname='A'或cname='B'哦,谢谢。这确实毫无意义。上述查询不起作用。现在通过教科书的方式,以下查询运行良好:从courierservice cs中选择cs.courid,city c其中c.cname='A'和cs.cid=c.cid并存在从city c2中选择cs2.cid,courierservice cs2其中cs2.courid=cs.courid和c2.cid=cs2.cid和c2.cname='B;再做一点分析,很明显,它会变得有点沉重!解决了!
SELECT courname FROM courier NATURAL JOIN (
SELECT courid
FROM courierservice JOIN city USING (cid)
WHERE cname IN ('A', 'B')
GROUP BY courid
HAVING SUM(cname='A') AND SUM(cname='B')
) t