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
.