Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

THAM GIA với GROUP BY trong DB chuẩn hóa về Tài nguyên, Chủ đề và Chương

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Một cách để đọc dữ liệu bảng từ Mysql sang Pig

  2. Thêm các trường bí danh MySQL với nhau

  3. Không thể kết nối với máy chủ MySQL cục bộ thông qua socket

  4. Câu lệnh tình huống trong MySQL

  5. MySql SP lồng nhau có thể là một nút cổ chai không?