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

Bagaimana cara mendapatkan banyak catatan terhadap satu catatan berdasarkan relasi?

Pertanyaan aslinya adalah spesifik basis data, tetapi mungkin ini adalah tempat yang baik untuk memasukkan jawaban yang lebih umum. Ini adalah pertanyaan umum. Konsep yang Anda gambarkan sering disebut sebagai 'Penggabungan Grup'. Tidak ada solusi standar dalam SQL-92 atau SQL-99. Jadi, Anda memerlukan solusi khusus vendor.

  • MySQL - Gunakan fungsi GROUP_CONCAT bawaan. Dalam contoh Anda, Anda akan menginginkan sesuatu seperti ini:
select 
  o.ID, o.Address, o.OtherDetails,
  GROUP_CONCAT( concat(e.firstname, ' ', e.lastname) ) as Employees
from 
  employees e 
  inner join organization o on o.org_id=e.org_id
group by o.org_id
  • PostgreSQL - PostgreSQL 9.0 sama sederhananya sekarang karena string_agg(expression, delimiter) sudah ada di dalamnya. Ini dia dengan 'ruang koma' di antara elemen:
select 
  o.ID, o.Address, o.OtherDetails,
  STRING_AGG( (e.firstname || ' ' || e.lastname), ', ' ) as Employees
from 
  employees e 
  inner join organization o on o.org_id=e.org_id
group by o.org_id

PostgreSQL sebelum 9.0 memungkinkan Anda untuk mendefinisikan fungsi agregat Anda sendiri dengan CREATE AGGREGATE. Sedikit lebih banyak bekerja daripada MySQL, tetapi jauh lebih fleksibel. Lihat postingan lain untuk lebih jelasnya. (Tentu saja PostgreSQL 9.0 dan yang lebih baru memiliki opsi ini juga.)

  • Oracle - ide yang sama menggunakan LISTAGG .

  • MS SQL Server - ide yang sama menggunakan STRING_AGG

  • Solusi penggantian - dalam teknologi basis data lain atau dalam versi yang sangat lama dari teknologi yang tercantum di atas, Anda tidak memiliki fungsi penggabungan grup ini. Dalam hal ini, buat prosedur tersimpan yang menggunakan org_id sebagai inputnya dan mengeluarkan nama karyawan yang digabungkan. Kemudian gunakan prosedur tersimpan ini dalam kueri Anda. Beberapa tanggapan lain di sini mencakup beberapa detail tentang cara menulis prosedur tersimpan seperti ini.

select 
  o.ID, o.Address, o.OtherDetails,
  MY_CUSTOM_GROUP_CONCAT_PROCEDURE( o.ID ) as Employees
from 
  organization o


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sistem Pesan dengan PHP/MySQL

  2. Integer panjang ditransformasikan ketika dimasukkan ke dalam kolom yang lebih pendek, tidak terpotong. Mengapa? Apa rumusnya?

  3. Python 'float64' tidak dapat dikonversi ke tipe MySQL tetapi dalam permintaan manual itu tidak masalah

  4. PHP memasukkan beberapa kotak centang DAN array kotak teks ke dalam Database MySQL

  5. File kunci MySQL salah untuk tabel tmp saat membuat banyak gabungan