私は MySQL を使用しています。スキーマは次のとおりです。
サプライヤー(sid: 整数、sname: 文字列、アドレス文字列)
部品(pid: 整数、pname: 文字列、色: 文字列)
カタログ(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 - グループ機能の使用が無効です
何が間違っているのでしょうか?
ベストアンサー1
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)