-
はい。非集計列とは、
MAX
などの集計関数を使用しない列のことです。 、COUNT
、SUM
、GROUP_CONCAT
、など。 -
列
a
列b
に機能的に依存していますb
の値の場合a
の特定の値を意味します 。これは通常、b
を意味します はテーブルの一意のキーであり、a
そのテーブルの他の列です。 -
によって一意に決定されるのは、機能従属性と同じです。
-
別の方法は、
GROUP BY
内のすべての非集計列を一覧表示することです。 リスト:GROUP BY a.Z, a.Y, a.X
。
このすべての理由は、GROUP BY
にない列を選択した場合です。 リストでは、グループ化された行の任意の行から取得されます。これにより、多くの一般的なエラーが発生します。たとえば、よくある間違いは次のように書くことです。
SELECT user_id, MAX(timestamp), ip_address
FROM user_logins
GROUP BY user_id
ip_address
を期待します 各ユーザーの最新のログインのアドレスが含まれます。ただし、実際にはすべてが含まれます MAX(timestamp)
の行のアドレスではなく、ログイン元のアドレスの 。 を参照してくださいSQL列の最大値を持つ行のみを選択
それを行う正しい方法について。
関数従属性の例外は、通常、結合で役立ちます。
SELECT u.user_id, u.user_name, MAX(l.timestamp)
FROM users AS u
JOIN user_logins AS l ON u.user_id = l.user_id
GROUP BY u.user_id
user_id
以降 users
の主キーです テーブルでは、user_name
を一意に決定します 、したがって、GROUP BY
に明示的にリストする必要はありません。 。