Mysql
 sql >> Datenbank >  >> RDS >> Mysql

JOIN mit GROUP BY in einer normalisierten Datenbank über Ressourcen, Themen und Kapitel

Ich kann nicht wirklich erkennen, was Sie erreichen wollen, aber es hört sich so an, als wollten Sie einfach eine Tabelle erhalten, die jedes Kapitel mit seinem Thema und seiner Ressource zeigt.

Wenn ja, dann folgendes 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;

wird genau das zurückgeben, gemäß http://sqlfiddle.com/#!9/ddf252/ 12

Oder ignorieren Sie die Join-IDs in der Auswahl:

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

gemäß http://sqlfiddle.com/#!9/ddf252/14

Wenn das nicht das ist, wonach Sie suchen, könnten Sie ein wenig erläutern, welche Ergebnisse Sie sehen möchten?

Bearbeiten :Um eine übersichtlichere Liste mit allen zugehörigen Datensätzen zurückzugeben

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

Gemäß http://sqlfiddle.com/#!9/ddf252/30

Endlich , um diese nach Kapitel und Thema zu gruppieren:

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

Wie hier zu sehen:http://sqlfiddle.com/#!9/ddf252/85

Ich habe die Ergebnisse überprüft und sie sehen gut aus - aber überprüfen Sie es noch einmal, da es in meinem Kopf ein bisschen wie MySQL Inception gelaufen ist (hier ist es nach 1 Uhr morgens)

Weitere Ergänzung:Eindeutige Werte pro Ressource

    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

Siehe http://sqlfiddle.com/#!9/ddf252/88