- MySQL
MySQL only_full_group_byエラーの直し方|1055
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'mig.c.name' ... this is incompatible with sql_mode=only_full_group_by は、GROUP BY で集計するときに、グループごとに1つに決まらない列を SELECT したときのエラーです。 MySQL 8.0 の既定の sql_mode(ONLY_FULL_GROUP_BY)で出ます。
エラー文の中の 'mig.c.name' が、問題の列です。直し方は、その列をどう1つに決めたいかで選びます。
| やりたいこと | 直し方 |
|---|---|
| 顧客ごとに集計して、名前も表示したい | 主キー(c.id)で GROUP BY する |
| グループ内のどの値でもよい(どれも同じと分かっている) | ANY_VALUE(列) |
| グループ内の値をすべて並べたい | GROUP_CONCAT(列) |
| グループごとの最新の1行(金額や日時をそろえて)が欲しい | ROW_NUMBER() で1行目を取る |
sql_mode から ONLY_FULL_GROUP_BY を外すのは、エラーが消えるだけで、間違った結果を返すことがあります(下で再現します)。
確認環境:MySQL 8.0.46(sql_mode は既定)(確認日 2026年10月11日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「MySQL only_full_group_byエラーの直し方|1055」
再現:都道府県ごとの合計に、名前を一緒に出す
customers orders
id name pref id customer_id amount ordered_at
1 佐藤 東京 1 1 1000 2026-10-01
2 鈴木 大阪 2 1 3000 2026-10-05
3 高橋 東京 3 2 2000 2026-10-02
4 3 500 2026-10-03
5 3 800 2026-10-09
SELECT pref, name, SUM(o.amount)
FROM customers c JOIN orders o ON o.customer_id = c.id
GROUP BY pref;
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column
'mig.c.name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
「東京」のグループには佐藤と高橋の2人がいるので、name を1つに決められません。MySQL 公式マニュアルでは、この状態の列を「GROUP BY の列に関数従属していない」と表現しています。
| エラー文の部分 | 意味 |
|---|---|
Expression #2 of SELECT list |
SELECT の 2番目の式(name) |
nonaggregated column 'mig.c.name' |
集計していない列 c.name |
not functionally dependent on columns in GROUP BY clause |
GROUP BY の列(pref)から1つに決まらない |
危険:sql_mode から外すと、ずれた値が返る
例1:名前が「どれか1つ」になる
SET SESSION sql_mode = ''; -- ONLY_FULL_GROUP_BY を外す
SELECT pref, name, SUM(o.amount) total FROM customers c JOIN orders o ON o.customer_id = c.id GROUP BY pref;
pref name total
東京 佐藤 5300 ← 高橋の分も合計に入っているのに、名前は佐藤だけ
大阪 鈴木 2000
例2:「最新の注文の金額」が、別の注文の金額になる
SET SESSION sql_mode = '';
SELECT customer_id, MAX(ordered_at) AS last_at, amount FROM orders GROUP BY customer_id;
customer_id last_at amount
1 2026-10-05 00:00:00 1000 ← 10-05 の注文は 3000 円。1000 円は 10-01 の注文の金額
2 2026-10-02 00:00:00 2000
3 2026-10-09 00:00:00 500 ← 10-09 の注文は 800 円
最新の日時と、別の行の金額が組み合わさって返りました。 エラーは出ないので、気づかずに帳票や画面に出てしまいます。MySQL 公式マニュアルでも、外した場合は「各グループのどの値を選ぶかはサーバーの自由で、結果は定まらない。ORDER BY を付けても選ばれる値は変えられない」とされています。以前の版の MySQL で動いていた SQL がこのエラーになったら、それは結果がずれていた可能性があるという知らせです。
直し方1:主キーで GROUP BY する(顧客ごと)
SELECT c.id, c.name, c.pref, SUM(o.amount) AS total
FROM customers c JOIN orders o ON o.customer_id = c.id
GROUP BY c.id;
id name pref total
1 佐藤 東京 4000
2 鈴木 大阪 2000
3 高橋 東京 1300
主キー(または NOT NULL の一意の列)で GROUP BY すると、同じテーブルのほかの列は1つに決まるので、name・pref を GROUP BY に書かなくても通りました(公式マニュアルの「関数従属」の扱い)。
直し方2:ANY_VALUE・GROUP_CONCAT(都道府県ごと)
SELECT pref, GROUP_CONCAT(DISTINCT name ORDER BY name) AS names, SUM(o.amount) AS total
FROM customers c JOIN orders o ON o.customer_id = c.id
GROUP BY pref;
pref names total
大阪 鈴木 2000
東京 佐藤,高橋 5300
| 関数 | 結果 | 使う場面 |
|---|---|---|
GROUP_CONCAT(列) |
グループの値をすべて並べる | 一覧として見せたい |
ANY_VALUE(列) |
グループのどれか1つ | どの行も同じ値だと分かっているとき(公式マニュアルの案内) |
MAX(列)・MIN(列) |
最大・最小 | 代表の値として最大・最小でよいとき |
ANY_VALUE は、sql_mode から外したのと同じく「どれか1つ」です。値が行によって違う列に使うと、例1と同じ問題になります。
直し方3:グループごとの最新の1行は ROW_NUMBER
SELECT customer_id, ordered_at, amount
FROM (
SELECT o.*, ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY ordered_at DESC) AS rn
FROM orders o
) t
WHERE rn = 1;
customer_id ordered_at amount
1 2026-10-05 00:00:00 3000 ← 日時と金額が同じ行のもの
2 2026-10-02 00:00:00 2000
3 2026-10-09 00:00:00 800
「グループごとの最新の1件」は、GROUP BY ではなくウィンドウ関数で書くと、同じ行の値がそろって取れます(MySQL 8.0 から使える)。
SELECT 以外でも出る
(ORDER BY に集計していない列)
SELECT pref, SUM(o.amount) total FROM ... GROUP BY pref ORDER BY c.name;
ERROR 1055 (42000): Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'mig.c.name' ...
(DISTINCT と ORDER BY)
SELECT DISTINCT pref FROM customers ORDER BY name;
ERROR 3065 (HY000): Expression #1 of ORDER BY clause is not in SELECT list, references column 'mig.customers.name' which is not in SELECT list; this is incompatible with DISTINCT
エラー文の of SELECT list・of ORDER BY clause で、どこに書いた列かが分かります。 HAVING も同じです。
sql_mode を確かめる・どうしても外すとき
SELECT @@GLOBAL.sql_mode, @@SESSION.sql_mode;
既存のアプリをすぐに直せないときに、一時的に外すなら、サーバー全体ではなく、そのアプリの接続(セッション)だけにします。外している間は、例1・例2のずれが起きうることを前提に、SQL を順に直します。
確認の手順(チェックリスト)
| 順番 | 確認すること | 方法 |
|---|---|---|
| 1 | 問題の列 | エラー文の nonaggregated column '...' |
| 2 | どこに書いた列か | of SELECT list・of ORDER BY clause |
| 3 | 何ごとに集計したいか | 主キーごとなら主キーで GROUP BY |
| 4 | その列をどう1つにするか | 集計関数・GROUP_CONCAT・同じ値と分かるなら ANY_VALUE |
| 5 | 最新の1件が欲しいか | ROW_NUMBER() |
| 6 | sql_mode | 外さない。外すならセッションだけ、一時的に |
よくある質問
Q. MySQL 5.6 から移したら出るようになりました。 A. 以前の版や、sql_mode を空にしていた環境では、このエラーは出ず、例1・例2のように「どれか1つ」の値が返っていました。エラーになった SQL は、結果がずれていなかったかも確かめます。
Q. PostgreSQL でも同じですか。
A. PostgreSQL では column "..." must appear in the GROUP BY clause or be used in an aggregate function という別のエラー文になります(関連記事で解説)。
まとめ
- GROUP BY のグループごとに1つに決まらない列を SELECT したエラー
- sql_mode から外すと、別の行の値が組み合わさって返ることがある(最新日時と別の注文の金額)
- 顧客ごとの集計は 主キーで GROUP BY、一覧は
GROUP_CONCAT ANY_VALUEは「どれか1つ」。同じ値と分かっている列だけに使う- グループごとの最新の1件は
ROW_NUMBER() - ORDER BY・HAVING・DISTINCT でも出る。エラー文で場所を見る
参考・出典
確認日はいずれも 2026年10月11日です。
- MySQL 8.0 Reference Manual「MySQL Handling of GROUP BY」:https://dev.mysql.com/doc/refman/8.0/en/group-by-handling.html
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「MySQL only_full_group_byエラーの直し方|1055」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。