sql >> Databasteknik >  >> RDS >> Mysql

GÅ MED MED GROUP BY i en normaliserad DB om resurser, ämnen &kapitel

Jag kan inte riktigt urskilja vad du försöker uppnå, men det låter som att du helt enkelt letar efter en tabell som visar varje kapitel med dess ämne och resurs.

Om så är fallet, då följande 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;

kommer att returnera just det, enligt http://sqlfiddle.com/#!9/ddf252/ 12

Eller ignorera anslutnings-ID:n i välj:

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

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

Om det inte är det du letar efter, skulle du kunna utveckla lite om vilka resultat du vill se?

Redigera :För att returnera en mer kortfattad lista med alla associerade 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

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

Äntligen , för att gruppera dessa efter kapitel och ämne:

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 du kan se här:http://sqlfiddle.com/#!9/ddf252/85

Jag har kontrollerat resultaten och de ser bra ut - men dubbelkolla, eftersom det har gått lite som MySQL Inception i mitt huvud (klockan är över 01:00 här)

Ytterligare tillägg:Distinkta värden per resurs

    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. Använder olika databaser olika namncitat?

  2. MYSQL Välj MAX-datum i ett sammanfogningsmeddelande

  3. Hur synkroniserar man Mysql DB om Master och slav har olika databas i fall av Mysql-replikering?

  4. Uppdatera eller infoga (flera rader och kolumner) från underfråga i PostgreSQL