GROUP_CONCAT() 関数を使用して GROUP BY 句で複数の列を結合する
MySQL エラー 1055: SELECT リストと GROUP BY 句の不一致
エラー概要
SELECT list は GROUP BY 句に含まれておらず、集計されていない列 'a.flg' が含まれています .... sql_mode=only_full_group_by と互換性がありません
原因:
このエラーは、GROUP BY
句でグループ化した列以外の列を SELECT
句で選択しようとしている場合に発生します。
sql_mode=only_full_group_by
設定が有効になっている場合、MySQL は、GROUP BY
句でグループ化した列のみを SELECT
句で選択することを許可します。
解決方法
このエラーを解決するには、以下のいずれかの方法があります。
GROUP BY 句に選択したい列を追加する:
SELECT a.id, a.name, COUNT(*) AS count
FROM table_a AS a
GROUP BY a.id, a.name;
集計関数を使用して選択したい列を集計する:
SELECT a.id, AVG(a.age) AS average_age
FROM table_a AS a
GROUP BY a.id;
sql_mode 設定を変更する:
SET sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
SELECT a.id, a.name, a.age
FROM table_a AS a;
テーブル構造:
CREATE TABLE table_a (
id INT,
name VARCHAR(255),
age INT,
flg TINYINT
);
データ:
INSERT INTO table_a (id, name, age, flg) VALUES
(1, 'John Doe', 30, 1),
(2, 'Jane Doe', 25, 0),
(3, 'John Smith', 40, 1),
(4, 'Jane Smith', 35, 0);
エラー発生例:
SELECT a.id, a.name, a.flg
FROM table_a AS a
GROUP BY a.id;
エラーメッセージ:
ERROR 1055 (42000): Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'a.flg' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
解決方法例:
SELECT a.id, a.name, COUNT(*) AS count
FROM table_a AS a
GROUP BY a.id, a.name;
結果:
+------+---------+-------+
| id | name | count |
+------+---------+-------+
| 1 | John Doe | 1 |
| 2 | Jane Doe | 1 |
| 3 | John Smith | 1 |
| 4 | Jane Smith | 1 |
+------+---------+-------+
SELECT a.id, AVG(a.age) AS average_age
FROM table_a AS a
GROUP BY a.id;
+------+-------------+
| id | average_age |
+------+-------------+
| 1 | 30.00000000 |
| 2 | 25.00000000 |
| 3 | 40.00000000 |
| 4 | 35.00000000 |
+------+-------------+
SET sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
SELECT a.id, a.name, a.flg
FROM table_a AS a
GROUP BY a.id;
+------+---------+------+
| id | name | flg |
+------+---------+------+
| 1 | John Doe | 1 |
| 2 | Jane Doe | 0 |
| 3 | John Smith | 1 |
| 4 | Jane Smith | 0 |
+------+---------+------+
SELECT a.id, a.name, a.age, a.flg
FROM table_a AS a;
+------+---------+------+------+
| id | name | age | flg |
+------+---------+------+------+
| 1 | John Doe | 30 | 1 |
| 2 | Jane Doe | 25 | 0 |
| 3 | John Smith | 40 | 1 |
| 4 | Jane Smith | 35 | 0 |
+------+---------+------+------+
上記のように、GROUP BY
句と SELECT
句の不一致によって発生するエラーを解決するには、状況に応じて適切な方法を選択する必要があります。
その他の解決方法
GROUP BY 句に GROUP_CONCAT() 関数を使用する:
SELECT a.id, GROUP_CONCAT(a.name) AS names
FROM table_a AS a
GROUP BY a.id;
+------+---------+
| id | names |
+------+---------+
| 1 | John Doe |
| 2 | Jane Doe |
| 3 | John Smith |
| 4 | Jane Smith |
+------+---------+
サブクエリを使用する:
SELECT t.id, t.name, COUNT(*) AS count
FROM (
SELECT a.id, a.name
FROM table_a AS a
GROUP BY a.id, a.name
) AS t
GROUP BY t.id;
+------+---------+-------+
| id | name | count |
+------+---------+-------+
| 1 | John Doe | 1 |
| 2 | Jane Doe | 1 |
| 3 | John Smith | 1 |
| 4 | Jane Smith | 1 |
+------+---------+-------+
CASE 式を使用する:
SELECT a.id,
CASE
WHEN a.flg = 1 THEN 'Yes'
ELSE 'No'
END AS flg_text
FROM table_a AS a
GROUP BY a.id;
+------+---------+
| id | flg_text |
+------+---------+
| 1 | Yes |
| 2 | No |
| 3 | Yes |
| 4 | No |
+------+---------+
これらの方法は、GROUP BY
句と SELECT
句の不一致を解決するための代替手段として使用できます。
上記のサンプルコードと説明を参考に、エラーを解決し、目的のデータを取得してください。
mysql group-by mysql-error-1055