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

MySQL:Bagaimana cara mengambil data dengan gabungan kiri jika kolom berisi banyak id?

Anda perlu menggunakan FIND_IN_SET() berfungsi sebagai kriteria join:

SELECT   info.*, GROUP_CONCAT(targets.value) AS value
FROM     info LEFT JOIN targets ON FIND_IN_SET(targets.id, info.target_ids)
GROUP BY info.id

Lihat di sqlfiddle .

Namun, Anda mungkin sebaiknya menormalkan struktur data Anda dan simpan relasi info-target Anda dalam tabel terpisah:

CREATE TABLE InfoTargets (
  InfoID   INT NOT NULL,
  TargetID INT NOT NULL,
  PRIMARY KEY (InfoID, TargetID),
  FOREIGN KEY (InfoID)   REFERENCES info    (id),
  FOREIGN KEY (TargetID) REFERENCES targets (id)
);

INSERT INTO InfoTargets VALUES
  (1,2),
  (3,4), (3,1),
  (4,2), (4,3), (4,1);

ALTER TABLE Info DROP COLUMN target_ids;

Maka Anda akan melakukan:

SELECT   info.id,
         GROUP_CONCAT(targets.id)    AS target_ids,
         GROUP_CONCAT(targets.value) AS value
FROM     InfoTargets
  LEFT JOIN info    ON   InfoID = InfoTargets.InfoID
  LEFT JOIN targets ON TargetID = InfoTargets.TargetID
GROUP BY info.id

Jika urutan target penting (dan mungkin berbeda antara setiap info item), Anda perlu membuat rank tambahan kolom di InfoTargets .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara mengganti atribusi kunci utama yang bertambah otomatis saat memasukkan nilai dalam tabel MySQL?

  2. Bagaimana cara menyimpan sejumlah besar catatan dalam database MySql?

  3. Kerangka ionik dan php mysql

  4. Daftar parameter klausa IN kosong di MySQL

  5. cc1:error:opsi baris perintah tidak dikenal -Wno-null-conversion dalam menginstal python-mysql di mac 10.7.5