3
select person
from person
inner join collectionmember
    on sourceobjectid=personid
group by sourceobjectid 
having count(sourceobjectid)>1;

group by 句を使用する場合、group by column 名は選択列リストに存在する必要があると言われていますが、上記のクエリは sourceobjectid を選択しなくても機能します。このクエリはどのように機能しますか?

4

2 に答える 2

3

結果は、検出された最初の行ではありません。MySQL は、いわゆる「非表示の列」の使用について非常に明確です。ドキュメントから引用するには:

MySQL は GROUP BY の使用を拡張して、選択リストが GROUP BY 句で指定されていない非集計列を参照できるようにします。これは、前述のクエリが MySQL で有効であることを意味します。この機能を使用すると、不要な列の並べ替えやグループ化を回避してパフォーマンスを向上させることができます。ただし、これは主に、GROUP BY で指定されていない各非集計列のすべての値が各グループで同じ場合に役立ちます。サーバーは各グループから任意の値を自由に選択できるため、それらが同じでない限り、選択された値は不確定です。さらに、ORDER BY 句を追加しても、各グループからの値の選択に影響を与えることはできません。結果セットのソートは値が選択された後に行われ、ORDER BY はサーバーが選択する各グループ内の値には影響しません。

この拡張機能の意図は、テーブルの主キーでグループ化するクエリを許可し、すべての追加列を配置する必要がないようにすることです。この動作は、実際には ANSI 標準と一致しています。

他の場合での「隠し列」の使用は疑わしいものです。選択される値は任意です。MySQL は、それらが同じ行から来ることさえ保証しません (実際にはそうしますが)。

于 2013-08-27T12:19:33.237 に答える