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期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?