आपको MySQL के FIND_IN_SET()
शामिल होने के मानदंड के रूप में कार्य करें:
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
इसे sqlfiddle पर देखें ।
हालांकि, सामान्यीकरण करना आपके लिए बेहतर होगा अपनी डेटा संरचना और अपने सूचना-लक्षित संबंधों को एक अलग तालिका में संग्रहीत करें:
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;
तब आप करेंगे:
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
यदि लक्ष्यों का क्रम महत्वपूर्ण है (और प्रत्येक info
के बीच भिन्न हो सकता है आइटम), आपको एक अतिरिक्त rank
create बनाना होगा InfoTargets
. में कॉलम ।