sql >> Databáze >  >> RDS >> Mysql

PŘIPOJTE SE ke GROUP BY v normalizované databázi o zdrojích, tématech a kapitolách

Opravdu nedokážu rozlišit, čeho se snažíte dosáhnout, ale zní to, jako byste jednoduše hledali tabulku, která by ukazovala každou kapitolu s jejím tématem a zdrojem.

Pokud ano, pak následující 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;

vrátí právě to, podle http://sqlfiddle.com/#!9/ddf252/ 12

Nebo ignorováním ID spojení ve výběru:

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

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

Pokud to není to, co hledáte, mohl byste trochu upřesnit, jaké výsledky chcete vidět?

Upravit :Návrat stručnějšího seznamu se všemi souvisejícími záznamy

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

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

Konečně , seskupit je podle kapitoly a tématu:

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 je vidět zde:http://sqlfiddle.com/#!9/ddf252/85

Zkontroloval jsem výsledky a vypadají dobře – ale zkontrolujte to ještě jednou, protože v mé hlavě je to trochu jako MySQL Inception (tady je po 1 hodině ráno)

Další dodatek:Odlišné hodnoty na zdroj

    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

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



  1. SQLite Představuje funkci UNIXEPOCH().

  2. Pole v Mysql KDE LIKE?

  3. Převod řetězce do formátu časového razítka MySQL v php

  4. Několik oblastí vylepšení v PostgreSQL 9.4