sql >> Database >  >> RDS >> Mysql

WORD LID met GROUP BY in een genormaliseerde database over bronnen, onderwerpen en hoofdstukken

Ik kan niet echt onderscheiden wat je probeert te bereiken, maar het klinkt alsof je gewoon op zoek bent naar een tabel die elk hoofdstuk laat zien met zijn onderwerp en bron.

Zo ja, dan de volgende 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;

zal precies dat retourneren, volgens http://sqlfiddle.com/#!9/ddf252/ 12

Of negeer de deelname-ID's in de selectie:

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

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

Als dat niet is wat u zoekt, kunt u dan iets meer vertellen over de resultaten die u wilt zien?

Bewerken :om een ​​beknoptere lijst met alle bijbehorende records terug te geven

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

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

Eindelijk , om deze per hoofdstuk en onderwerp te groeperen:

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

Zoals hier te zien:http://sqlfiddle.com/#!9/ddf252/85

Ik heb de resultaten gecontroleerd en ze zien er goed uit - maar controleer het nog een keer, want het is een beetje zoals MySQL Inception in mijn hoofd (het is hier na 1 uur 's nachts)

Verdere toevoeging:Verschillende waarden per grondstof

    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

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



  1. Prestaties van LIKE-query's op miljoenen rijtabellen, MySQL

  2. Redenen om optimistisch te zijn over de toekomst van Microsoft Access

  3. Hoe krijg je meerdere resultaten uit een enkele CallableStatement?

  4. 7 gratis hulpprogramma's voor het maken van databasediagrammen voor drukke gegevensmensen