sql >> Database teknologi >  >> RDS >> Mysql

MySQL:Hvordan henter man data med venstre-join, hvis kolonnen indeholder flere id'er?

Du skal bruge MySQL's FIND_IN_SET() fungere som joinkriteriet:

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

Se den på sqlfiddle .

Du ville dog sandsynligvis være bedst at normalisere din datastruktur og gem dine info-mål-relationer i en separat tabel:

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;

Så ville du gøre:

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

Hvis rækkefølgen af ​​mål er vigtig (og kan variere mellem hver info). element), skal du oprette en ekstra rank kolonne i InfoTargets .




  1. Hvordan dropper man en PostgreSQL-database, hvis der er aktive forbindelser til den?

  2. Mangler /var/lib/mysql/mysql.sock-fil

  3. Skjuler MySQL-legitimationsoplysninger i applikationen

  4. Dvalebrug af PostgreSQL-sekvens påvirker ikke sekvenstabellen