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只返回一行,我已经应用了一个分组子句。