私は2つのテーブルを持っています:
CREATE TABLE instructions (
`id_instruction` INT(11),
`id_step` INT(11)
);
CREATE TABLE steps (
`id_instruction` INT(11),
`id_step` INT(11),
`val` VARCHAR(255)
);
1 つの表には説明が含まれ、別の表には手順が含まれています。各命令には多くのステップが含まれる場合があります。現在、データは次のとおりです。
INSERT INTO instructions (`id_instruction`, `id_step`) VALUES (1, 0), (1, 1), (1, 2);
INSERT INTO steps (`id_instruction`, `id_step`, `val` ) VALUES (1, 0, 'One'), (1, 0, 'Two'), (1, 0, 'Three'); /* step 0 */
INSERT INTO steps (`id_instruction`, `id_step`, `val` ) VALUES (1, 1, 'Five'), (1, 1, 'Six'), (1, 1, 'Seven'); /* step 1 */
INSERT INTO steps (`id_instruction`, `id_step`, `val` ) VALUES (1, 2, 'Eight'), (1, 2, 'Nine'), (1, 2, 'Ten'); /* step 2 */
命令ごとに、2 つの連結が必要です。1 つval
はゼロ ステップの列の値を連結し、もう 1 つは命令の最大ステップの同じ列の値を連結します。最大のステップを取得する方法と単一のグループ連結を作成する方法は知っていますが、2 つの連結を行おうとすると重複が発生します。今、私のクエリは次のようになります。
SELECT maxstep, i.id_instruction, i.id_step, GROUP_CONCAT(s.val) AS val_0
FROM instructions i
INNER JOIN (
SELECT MAX(id_step) AS maxstep, id_instruction FROM instructions i
GROUP BY i.id_instruction
) i2 ON i2.id_instruction = i.id_instruction
LEFT JOIN steps s ON s.id_instruction = i.id_instruction AND s.id_step = i.id_step
GROUP BY i.id_instruction, i.id_step
ペア命令ステップごとに値を連結するだけです。しかし、の値も連結するもう1つの連結が必要ですmaxstep
。望ましい結果は次のようになります。
| maxstep | id_instruction | val_0 | val_1 |
| 2 | 1 | One,Two, Three | Eight, Nine, Ten |
PS。MAX とグループ化の代わりに結合します。これは、その値を追加の結合で使用してさらに連結したいからです。