Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

GABUNG dengan GROUP BY dalam DB yang Dinormalisasi tentang Sumber Daya, Topik &Bab

Saya tidak dapat benar-benar membedakan apa yang ingin Anda capai, tetapi sepertinya Anda hanya mencari tabel yang menunjukkan setiap bab dengan topik dan sumbernya.

Jika sudah, maka berikut SQLnya:

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;

akan mengembalikan hanya itu, sesuai http://sqlfiddle.com/#!9/ddf252/ 12

Atau, abaikan ID gabungan di pilih:

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

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

Jika bukan itu yang Anda cari, dapatkah Anda menjelaskan sedikit tentang hasil yang ingin Anda lihat?

Sunting :Untuk mengembalikan daftar yang lebih ringkas dengan semua catatan terkait

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

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

Akhirnya , untuk mengelompokkan ini menurut bab dan topik:

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

Seperti yang terlihat di sini:http://sqlfiddle.com/#!9/ddf252/85

Saya telah memeriksa hasilnya, dan mereka terlihat baik-baik saja - tetapi periksa kembali, karena hasilnya agak mirip dengan MySQL Inception di kepala saya (sudah lewat jam 1 pagi di sini)

Tambahan lebih lanjut:Nilai berbeda per sumber daya

    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

Lihat 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. Kueri SQL Maksimum per halaman

  2. Bagaimana menemukan perbedaan antara dua tanggal di MySQL

  3. mysql perbarui beberapa kolom dengan yang sama sekarang ()

  4. Bagaimana cara mengatur Hibernate untuk membaca/menulis ke sumber data yang berbeda?

  5. Variabel 'sql_mode' tidak dapat disetel ke nilai 'NO_AUTO_CREATE_USER'