Mysql
 sql >> база данни >  >> RDS >> Mysql

ПРИСЪЕДИНЕТЕ СЕ с GROUP BY в нормализирана БД за ресурси, теми и глави

Не мога да различа какво точно се опитвате да постигнете, но звучи сякаш просто искате да получите таблица, която показва всяка глава с нейната тема и ресурс.

Ако е така, тогава следния 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;

ще върне точно това, съгласно http://sqlfiddle.com/#!9/ddf252/ 12

Или игнориране на идентификаторите на присъединяване в избраното:

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

според http://sqlfiddle.com/#!9/ddf252/14

Ако това не е това, което търсите, бихте ли обяснили малко по-подробно какви резултати искате да видите?

Редактиране :За да върнете по-сбит списък с всички свързани записи

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

Съгласно http://sqlfiddle.com/#!9/ddf252/30

Най-накрая , за да ги групирате по глава и тема:

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

Както се вижда тук:http://sqlfiddle.com/#!9/ddf252/85

Проверих резултатите и изглеждат добре - но проверете отново, тъй като в главата ми е изчезнало малко като MySQL Inception (тук е минал 1 сутринта)

Допълнително допълнение:Различни стойности на ресурс

    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

Вижте 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. Защо MySQL позволява групиране по заявки БЕЗ агрегатни функции?

  2. Как да напишете няколко колони в клауза с sqlalchemy

  3. Извличане на MySQL с Kivy

  4. MYSQL Left Присъединете последния ред на резултата

  5. Ограничете броя на страницата с пагинация