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

MySQL:Làm cách nào để tìm nạp dữ liệu bằng phép nối bên trái nếu cột chứa nhiều id?

Bạn cần sử dụng FIND_IN_SET() hoạt động như tiêu chí kết hợp:

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

Xem nó trên sqlfiddle .

Tuy nhiên, tốt nhất bạn nên chuẩn hóa cấu trúc dữ liệu của bạn và lưu trữ các mối quan hệ mục tiêu thông tin của bạn trong một bảng riêng biệt:

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;

Sau đó, bạn sẽ làm:

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

Nếu thứ tự của các mục tiêu là quan trọng (và có thể khác nhau giữa mỗi info item), bạn sẽ cần tạo thêm một rank trong 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. làm thế nào để tìm và thay thế một từ trong cột mysql?

  2. Không thể chuyển tham số bằng tham chiếu trong MySQLi

  3. Tại sao PDO ::lastInsertId trả về 0?

  4. Ví dụ về câu lệnh JDBC - Chèn hàng loạt, cập nhật, xóa

  5. Hibernate SQL QUERY, sự cố với kiểu dữ liệu TEXT trong mysql