sql >> データベース >  >> RDS >> Mysql

リソース、トピック、および章について、正規化されたDBでGROUPBYを使用して結合する

    あなたが達成しようとしていることを実際に区別することはできませんが、トピックとリソースを含むすべての章を示す表を取得しようとしているようです。

    その場合、次のSQL:

    select * from resources r
    JOIN topics_to_resource ttr ON ttr.tr_resid = r.res_id
    JOIN topics t on t.t_id = ttr.tr_tid
    JOIN topics_to_chapter ttc on ttc.tch_tid = t.t_id
    JOIN chapters ch ON ch.ch_id = tch_chid
    ORDER BY r.res_id;
    

    http://sqlfiddle.com/#!9/ddf252/に従って、それだけが返されます。 12

    または、select:

    の結合IDを無視します。
    select r.res_id, r.res_name, t.t_id, t.t_name, ch.ch_id, ch.ch_name from resources r
    JOIN topics_to_resource ttr ON ttr.tr_resid = r.res_id
    JOIN topics t on t.t_id = ttr.tr_tid
    JOIN topics_to_chapter ttc on ttc.tch_tid = t.t_id
    JOIN chapters ch ON ch.ch_id = tch_chid
    ORDER BY r.res_id, t.t_id, ch.ch_id
    

    http://sqlfiddle.com/#!9/ddf252/14 による

    それがあなたが探しているものではない場合、あなたが見ている結果について少し詳しく説明していただけますか?

    編集 :関連するすべてのレコードを含むより簡潔なリストを返すには

    select 
    CONCAT(r.res_id,': ',r.res_name) 'Resources', 
    GROUP_CONCAT(CONCAT(' (',t.t_id,': ',t.t_name,')')) 'Topics', 
    GROUP_CONCAT(CONCAT(' (',ch.ch_id,': ',ch.ch_name,')')) 'Chapters'
    from resources r
    JOIN topics_to_resource ttr ON ttr.tr_resid = r.res_id
    JOIN topics t on t.t_id = ttr.tr_tid
    JOIN topics_to_chapter ttc on ttc.tch_tid = t.t_id
    JOIN chapters ch ON ch.ch_id = tch_chid
    GROUP BY r.res_id
    ORDER BY r.res_id, t.t_id, ch.ch_id
    

    http://sqlfiddle.com/#!9/ddf252/30 による

    最後に 、これらを章とトピックでグループ化するには:

    select 
    CONCAT(res_id,': ',res_name) 'Resources', 
    GROUP_CONCAT(`chapters` order by chapters separator '\n') as 'Content'
    FROM
      (SELECT r.res_id 'res_id',
              r.res_name 'res_name', 
              t.t_id 't_id',
              t.t_name 't_name',
              CONCAT(t.t_name,': (',GROUP_CONCAT(ch.ch_name ORDER BY t.t_name separator ','),')') 'Chapters'
        FROM resources r
          JOIN topics_to_resource ttr ON ttr.tr_resid = r.res_id
          JOIN topics t on t.t_id = ttr.tr_tid
          JOIN topics_to_chapter ttc on ttc.tch_tid = t.t_id
          JOIN chapters ch ON ch.ch_id = tch_chid
        GROUP BY res_id, t_id
        ORDER BY r.res_id, t.t_id, ch.ch_id) as t
    GROUP BY res_id
    

    ここに見られるように: http://sqlfiddle.com/#!9/ddf252/85

    結果を確認しましたが、問題はないようですが、頭の中でMySQL Inceptionに少し似ているため、再確認してください(ここでは午前1時を過ぎています)

    さらに追加:リソースごとの個別の値

        select CONCAT(r.res_id,': ',r.res_name) 'Resources', GROUP_CONCAT(distinct t_name separator ',') 'Topics', 
    GROUP_CONCAT(distinct ch.ch_name separator ',') 'Chapters'
    from resources r
    JOIN topics_to_resource ttr ON ttr.tr_resid = r.res_id
    JOIN topics t on t.t_id = ttr.tr_tid
    JOIN topics_to_chapter ttc on ttc.tch_tid = t.t_id
    JOIN chapters ch ON ch.ch_id = tch_chid
    GROUP BY r.res_id
    ORDER BY r.res_id, t.t_id, ch.ch_id
    

    http://sqlfiddle.com/#!9/ddf252/88 を参照してください。



    1. JOIN(SELECT ...)ue ON 1 =1?

    2. MySQLはCSVデータからNULL値をロードします

    3. mysqliとmysqlの違いは?

    4. SpringBatch-Postgresでメタデータテーブルを作成して実際のデータをmysqlにロードすることができません