MySQL:组函数的使用无效
我正在使用MySQL。 这是我的模式:
供应商( sid:整数 ,sname:string,地址string)
部件( pid:整数 ,pname:string,颜色:string)
目录( sid:整数,pid:整数 ,成本:实数)
(主键是粗体)
我试图编写一个查询来select由至less两个供应商生产的所有零件:
-- Find the pids of parts supplied by at least two different suppliers. SELECT c1.pid -- select the pid FROM Catalog AS c1 -- from the Catalog table WHERE c1.pid IN ( -- where that pid is in the set: SELECT c2.pid -- of pids FROM Catalog AS c2 -- from catalog WHERE c2.pid = c1.pid AND COUNT(c2.sid) >= 2 -- where there are at least two corresponding sids );
首先,我是否以正确的方式去做这件事?
其次,我得到这个错误:
1111 – 无法使用组function
我究竟做错了什么?
你需要使用HAVING,而不是在哪里。
区别在于:WHERE子句过滤MySQLselect的行。 然后, MySQL将这些行分组在一起,并汇总COUNT函数的编号。
HAVING就像WHERE,只有在计算了COUNT值之后才会发生,所以它会按照你的预期工作。 重写你的子查询:
( -- where that pid is in the set: SELECT c2.pid -- of pids FROM Catalog AS c2 -- from catalog WHERE c2.pid = c1.pid HAVING COUNT(c2.sid) >= 2)
首先,你得到的错误是由于你在哪里使用COUNT
函数 – 你不能在WHERE
子句中使用聚合(或组合)函数。
其次,不要使用子查询,只需将表join自己:
SELECT a.pid FROM Catalog as a LEFT JOIN Catalog as b USING( pid ) WHERE a.sid != b.sid GROUP BY a.pid
我相信应该只返回行至less有两行存在相同的pid
但至less有2个sid
。 为了确保每个pid
只返回一行,我已经应用了一个分组子句。