Mysql
 sql >> Baza danych >  >> RDS >> Mysql

DOŁĄCZ do GROUP BY w znormalizowanej bazie danych o zasobach, tematach i rozdziałach

Naprawdę nie potrafię rozróżnić, co chcesz osiągnąć, ale wygląda na to, że po prostu szukasz tabeli, która pokazuje każdy rozdział wraz z jego tematem i zasobami.

Jeśli tak, to następujący kod 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;

zwróci właśnie to, zgodnie z http://sqlfiddle.com/#!9/ddf252/ 12

Lub ignorując identyfikatory przyłączenia w zaznacz:

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

zgodnie z http://sqlfiddle.com/#!9/ddf252/14

Jeśli nie tego szukasz, czy mógłbyś nieco omówić wyniki, które chcesz zobaczyć?

Edytuj :Aby zwrócić bardziej zwięzłą listę ze wszystkimi powiązanymi rekordami

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

Zgodnie z http://sqlfiddle.com/#!9/ddf252/30

Wreszcie , aby pogrupować je według rozdziału i tematu:

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

Jak widać tutaj:http://sqlfiddle.com/#!9/ddf252/85

Sprawdziłem wyniki i wyglądają dobrze - ale sprawdź jeszcze raz, ponieważ w mojej głowie trochę przypominał MySQL Inception (tutaj jest po 1 w nocy)

Dalsze uzupełnienie:odrębne wartości na zasób

    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

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kolumna aktualizacji MySQL z innej kolumny w tej samej tabeli

  2. Jak zgłosić błąd w funkcji MySQL

  3. Grupuj wyjście POKAŻ KOLUMNY w listę rozdzielaną przecinkami

  4. PDO::rowCount VS COUNT(*)

  5. Uzyskaj identyfikator wiersza, gdy naruszony jest UNIQUE KEY