0

私は現在、私が書いたこのSQLステートメントを持っており、それは機能しますが、それは私が望むものではありません。私は何時間もそれに取り組んできましたが、それ以上進むことができないようです。

select parent.id as parent_id, parent.subject as parent,s.id,s.subject from (select s.id, s.subject from subjects s where parent_id = 0) parent join subjects s on parent.id = s.parent_id order by parent.subject, s.subject

すべてのサブジェクトを取得して正しく順序付けしていますが、各グループの先頭にある親サブジェクト(parent_id = 0)も返したいと思います。これは、一部の親が下に主題を持っていない可能性があるためですが、それでも私はそれらを返す必要があります。また、最初に親が必要で、次に子のサブジェクトが必要なため、これを実行しようとすると順序がオフになります。それが理にかなっていることを願っていますが、そうでない場合はただ尋ねてください。

どんな助けでもいただければ幸いです。

ありがとう

スティーブ

4

1 に答える 1

0

あなたは、親の行によって行のセットをグループ化することについて話している。

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       |
于 2012-06-17T01:28:56.113 に答える