119

私はMySQLを使用しています。ここに私のスキーマがあります:

サプライヤー ( sid: 整数、sname: 文字列、アドレス文字列)

パーツ ( pid: 整数、pname: 文字列、色: 文字列)

Catalog( sid: 整数、pid: 整数、コスト: 実数)

(主キーは太字で示されています)

少なくとも 2 つのサプライヤーによって製造されたすべての部品を選択するクエリを作成しようとしています。

-- 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行存在するが、少なくとも2行ある行のみを返す必要があると私は信じていますsid。1 回につき 1 行だけが返されるようにするために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')

問題を 2 つのステップに分割することで、これを回避できます。

  1. 内部集計を変数に保存する
select @avg:=avg(close) from prices;
  1. 変数に対して外部集計を実行します
select sum(@avg) from prices;
于 2022-02-09T23:28:00.247 に答える