Mysql
 sql >> Base de données >  >> RDS >> Mysql

JOIN avec GROUP BY dans une base de données normalisée sur les ressources, les sujets et les chapitres

Je ne peux pas vraiment distinguer ce que vous essayez d'accomplir, mais il semble que vous cherchiez simplement à obtenir un tableau qui montre chaque chapitre avec son sujet et sa ressource.

Si oui, alors le SQL suivant :

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;

renverra juste cela, selon http://sqlfiddle.com/#!9/ddf252/ 12

Ou, en ignorant les ID de jointure dans la sélection :

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

selon http://sqlfiddle.com/#!9/ddf252/14

Si ce n'est pas ce que vous recherchez, pourriez-vous nous en dire un peu plus sur les résultats que vous souhaitez obtenir ?

Modifier :Pour renvoyer une liste plus concise avec tous les enregistrements associés

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

Selon http://sqlfiddle.com/#!9/ddf252/30

Enfin , pour les regrouper par chapitre et sujet :

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

Comme on le voit ici :http://sqlfiddle.com/#!9/ddf252/85

J'ai vérifié les résultats, et ils ont l'air bien - mais revérifiez, car c'est un peu comme MySQL Inception dans ma tête (il est plus d'une heure du matin ici)

Ajout supplémentaire :Valeurs distinctes par 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

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