2

私は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 とグループ化の代わりに結合します。これは、その値を追加の結合で使用してさらに連結したいからです。

4

2 に答える 2

1

内部結合が最高のステップのみを取得するようにクエリを少し変更し、外部クエリを id_step=0 のみを取るように設定することで、必要なものを取得できます。

SELECT maxstep, i.id_instruction,GROUP_CONCAT(s.val) AS val_0, val_1 
FROM instructions i
INNER JOIN (
 SELECT MAX(ins.id_step) AS maxstep, ins.id_instruction, GROUP_CONCAT(st.val) as val_1 FROM instructions ins
 LEFT JOIN steps st ON st.id_instruction = ins.id_instruction AND st.id_step = ins.id_step 
 where (ins.id_instruction, ins.id_step) in (select id_instruction, max(id_step) from instructions group by id_instruction)
 GROUP BY ins.id_instruction, ins.id_step  
 order by maxstep, ins.id_instruction, st.val
) 
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 
where i.id_step=0
GROUP BY i.id_instruction, i.id_step;

拡張データを使用したクエリの結果は次のようになります

| maxstep | id_instruction |      val_0     |      val_1       |
|    2    |       1        |  One,Two,Three |  Eight,Nine,Ten  |
|    3    |       2        |  One,Two,Three |     21,22,23     |
于 2013-08-22T09:13:39.160 に答える