119

我正在使用 MySQL。这是我的架构:

供应商(sid:整数,sname:字符串,地址字符串)

部分(pid:整数,pname:字符串,颜色:字符串)

目录(sid:整数,pid:整数,成本:实数)

(主键加粗)

我正在尝试编写一个查询来选择至少由两个供应商制造的所有零件:

-- 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 - 组功能的使用无效

我究竟做错了什么?

4

3 回答 3

199

你需要使用HAVING,而不是WHERE

区别在于:WHERE子句过滤 MySQL 选择的行。然后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)
于 2010-02-25T00:59:05.647 回答
12

首先,您遇到的错误是由于您使用COUNT函数的位置 - 您不能在WHERE子句中使用聚合(或组)函数。

其次,不要使用子查询,只需将表连接到自身:

SELECT a.pid 
FROM Catalog as a LEFT JOIN Catalog as b USING( pid )
WHERE a.sid != b.sid
GROUP BY a.pid

我认为应该只返回至少有两行相同pid但至少有 2 行sid的行。为了确保您每次只取回一行,pid我应用了一个分组子句。

于 2010-02-25T00:56:47.993 回答
0

如果您的 where 子句中没有聚合函数,则另一个可能的1111 - Invalid use of group function错误来源是您有嵌套的聚合函数:

select sum(avg(close)) from prices;
(1111, 'Invalid use of group function')

您可以通过将问题分为两个步骤来解决此问题:

  1. 将内部聚合保存到变量中
select @avg:=avg(close) from prices;
  1. 针对变量运行外部聚合
select sum(@avg) from prices;
于 2022-02-09T23:28:00.247 回答