sql >> Database teknologi >  >> RDS >> Mysql

JOIN med GROUP BY i en normaliseret DB om ressourcer, emner og kapitler

Jeg kan ikke rigtig skelne, hvad du forsøger at opnå, men det lyder som om, du simpelthen leder efter en tabel, der viser hvert kapitel med dets emne og ressource.

Hvis ja, så følgende 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;

vil returnere netop det, ifølge http://sqlfiddle.com/#!9/ddf252/ 12

Eller ignorer join-id'erne i vælg:

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

ifølge http://sqlfiddle.com/#!9/ddf252/14

Hvis det ikke er det, du leder efter, kan du så uddybe lidt om, hvilke resultater du ønsker at se?

Rediger :For at returnere en mere kortfattet liste med alle tilknyttede poster

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

Ifølge http://sqlfiddle.com/#!9/ddf252/30

Endelig , for at gruppere disse efter kapitel og emne:

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

Som det ses her:http://sqlfiddle.com/#!9/ddf252/85

Jeg har tjekket resultaterne, og de ser fine ud - men dobbelttjek, da det er gået lidt som MySQL Inception i mit hoved (klokken er over 01:00 her)

Yderligere tilføjelse:Distinkte værdier pr. 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

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



  1. Sådan komprimeres og repareres en database automatisk i Access 2016

  2. Brug af konfigurationstabeller til at definere den faktiske arbejdsgang

  3. Sådan opdaterer du rækker med en tilfældig dato

  4. MYSQL fuldtekst søgerækkefølge efter relevans