sql >> Databáze >  >> RDS >> Mysql

MySQL:Jak načíst data pomocí levého spojení, pokud sloupec obsahuje více ID?

Musíte použít MySQL FIND_IN_SET() fungovat jako kritérium spojení:

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

Podívejte se na sqlfiddle .

Pravděpodobně však bude nejlepší normalizovat svou datovou strukturu a uložte své vztahy mezi informacemi a cíli do samostatné tabulky:

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;

Pak byste udělali:

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

Pokud je důležité pořadí cílů (a může se lišit mezi jednotlivými info položku), budete muset vytvořit další rank v InfoTargets .




  1. Jak provedu uloženou proceduru MS SQL Server v java/jsp a vrátím data tabulky?

  2. #1075 - Nesprávná definice tabulky; může být pouze jeden automatický sloupec a musí být definován jako klíč

  3. Při kopírování hierarchických dat zachovejte vztahy rodiče a potomka

  4. Jak vynutit referenční integritu u dědičnosti jedné tabulky?