Tôi thực sự không thể phân biệt được những gì bạn đang cố gắng đạt được, nhưng có vẻ như bạn chỉ đơn giản là đang tìm kiếm một bảng hiển thị mọi chương với chủ đề và tài nguyên của nó.
Nếu vậy, thì SQL sau:
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;
sẽ chỉ trả về điều đó, theo http://sqlfiddle.com/#!9/ddf252/ 12
Hoặc, bỏ qua các ID tham gia trong lựa chọn:
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
theo http://sqlfiddle.com/#!9/ddf252/14
Nếu đó không phải là những gì bạn đang tìm kiếm, bạn có thể giải thích một chút về kết quả mà bạn đang muốn thấy không?
Chỉnh sửa :Để trả về một danh sách ngắn gọn hơn với tất cả các bản ghi được liên kết
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
Theo http://sqlfiddle.com/#!9/ddf252/30
Cuối cùng , để nhóm những thứ này theo chương và chủ đề:
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
Như đã thấy ở đây: http://sqlfiddle.com/#!9/ddf252/85
Tôi đã kiểm tra kết quả và chúng trông ổn - nhưng hãy kiểm tra kỹ, vì nó đã biến mất một chút giống MySQL Inception trong đầu tôi (đã hơn 1 giờ sáng ở đây)
Bổ sung thêm:Các giá trị riêng biệt trên mỗi tài nguyên
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
Xem http://sqlfiddle.com/#!9/ddf252/88