使用する際に潜在的に予期しない結果を避けるためにGROUP BY、集計機能なしとして受け入れ答えに使用されている MySQLは取得して自由であるため、いかなる集約関数を使用していないときにグループ化されたデータセット内の値を[原文]とし、問題ONLY_FULL_GROUP_BY。除外結合の使用を検討してください。
除外結合-明確なエンティティ
firstnameとlastnameが一意にインデックス付けされている(あいまいでない)と仮定すると、の代わりにをGROUP BY使用して並べ替えをLEFT JOIN行い、結果セットをフィルター処理することもできます。これは、除外JOINとも呼ばれます。
デモを見る
昇順(AZ)
AZから姓で並べられた個別の名を取得するには
クエリ
SELECT t1.*
FROM table_name AS t1
LEFT JOIN table_name AS t2
ON t1.firstname = t2.firstname
AND t1.lastname > t2.lastname
WHERE t2.id IS NULL;
結果
| id | firstname | lastname |
|----|-----------|----------|
| 2 | Bugs | Bunny |
| 1 | John | Doe |
降順(ZA)
ZAから姓で並べられた固有の名を取得するには
クエリ
SELECT t1.*
FROM table_name AS t1
LEFT JOIN table_name AS t2
ON t1.firstname = t2.firstname
AND t1.lastname < t2.lastname
WHERE t2.id IS NULL;
結果
| id | firstname | lastname |
|----|-----------|----------|
| 2 | Bugs | Bunny |
| 3 | John | Johnson |
その後、結果のデータを必要に応じて注文できます。
除外結合-あいまいなエンティティ
姓と名の組み合わせが一意ではなく(あいまい)、同じ値の行が複数ある場合は、JOIN条件にOR条件を含めて結果セットをフィルタリングし、IDでフィルタリングすることもできます。
デモを見る
table_nameデータ
(1, 'John', 'Doe'),
(2, 'Bugs', 'Bunny'),
(3, 'John', 'Johnson'),
(4, 'John', 'Doe'),
(5, 'John', 'Johnson')
クエリ
SELECT t1.*
FROM table_name AS t1
LEFT JOIN table_name AS t2
ON t1.firstname = t2.firstname
AND (t1.lastname > t2.lastname
OR (t1.firstname = t1.firstname AND t1.lastname = t2.lastname AND t1.id > t2.id))
WHERE t2.id IS NULL;
結果
| id | firstname | lastname |
|----|-----------|----------|
| 1 | John | Doe |
| 2 | Bugs | Bunny |
順序付きサブクエリ
編集
順序付けられたサブクエリを使用した私の元の回答は、MySQL 5.7.5より前に作成されました。ONLY_FULL_GROUP_BY。代わりに、上記の除外結合の例を使用してください。
注意することも重要です。ONLY_FULL_GROUP_BYが無効になっている場合(MySQL 5.7.5より前の元の動作)、GROUP BYMySQLはグループ化されているデータセット内の任意の値を自由に選択できるため、集計関数なしでを使用すると、予期しない結果が生じる可能性があります[sic]。
意味ID又はlastname値が取得されてもよい関連付けられていないことを検索さとfirstname行。
警告
MySQLをGROUP BY使用すると、期待どおりの結果が得られない場合がありますORDER BY
テストケースの例を見る
期待される結果を保証するための最良の実装方法は、順序付けられたサブクエリを使用して結果セットのスコープをフィルタリングすることです。
table_nameデータ
(1, 'John', 'Doe'),
(2, 'Bugs', 'Bunny'),
(3, 'John', 'Johnson')
クエリ
SELECT * FROM (
SELECT * FROM table_name ORDER BY ID DESC
) AS t1
GROUP BY FirstName
結果
| ID | first | last |
|----|-------|---------|
| 2 | Bugs | Bunny |
| 3 | John | Johnson |
比較
GROUP BYと組み合わせて使用した場合の予期しない結果を示すにはORDER BY
クエリ
SELECT * FROM table_name GROUP BY FirstName ORDER BY ID DESC
結果
| ID | first | last |
|----|-------|-------|
| 2 | Bugs | Bunny |
| 1 | John | Doe |