あなたは、親の行によって行のセットをグループ化することについて話している。
MySQLでこれを行う方法を知っている唯一の方法はGROUP_CONCAT()
、サブジェクトを行ごとにグループ化せず、グループ化された文字列を作成する関数を使用することです。
できることは次のとおりです。
SELECT
a.id,
a.subject,
GROUP_CONCAT(CONCAT(b.id, ':::', b.subject) ORDER BY b.subject SEPARATOR '|||') AS subjectlist
FROM
subjects a
LEFT JOIN
subjects b ON a.id = b.parent_id
WHERE
a.parent_id = 0
GROUP BY
a.id,
a.subject
ORDER BY
a.subject
したがって、これにより、次のような結果セットが得られます。
id | subject | subjectlist
---------------------------------------------------------------------
2 | subj1 | 23:::childsubj1|||28:::childsubj4
3 | subj2 | 18:::childsubj8|||55:::childsubj16
4 | subj3 | NULL
アプリケーションで使用している言語によっては、文字列を最初に各サブジェクトを区切る配列に「分解」してから、そのサブジェクトのIDと名前を区切ることができる場合があります。subjects
|||
:::
明らかに、これの欠点は、子のサブジェクト名に、使用する区切り文字のいずれ|||
かまたはいずれかが含まれていないことを確認する必要があることです。:::
編集:実験的に、私はあなたが探しているものに近いかもしれないこの代替ソリューションを思いついた:
試す:
SELECT
c.subj,
c.id
FROM
(
SELECT
CONCAT('---> ', b.subject) AS subj,
b.id,
CONCAT(a.subject, b.subject) AS orderfactor
FROM
subjects a
INNER JOIN
subjects b ON a.id = b.parent_id
WHERE
a.parent_id = 0
UNION ALL
SELECT
subject AS subj,
id,
subject AS orderfactor
FROM
subjects
WHERE
parent_id = 0
) c
ORDER BY
c.orderfactor
このクエリは、次の行に沿った結果を提供するはずです。
subject | id |
----------------------------------------------------------
subj1 | 2 |
---> childsubj1 | 23 |
---> childsubj4 | 28 |
subj2 | 3 |
---> childsubj8 | 18 |
---> childsubj16 | 55 |
subj3 | 4 |
subj4 | 5 |
---> childsubj10 | 79 |