Mysql
 sql >> база данни >  >> RDS >> Mysql

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 колона в 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. MySQL index_length в байтове ли е?

  2. Вложена заявка в node js с помощта на mysql

  3. Кога се актуализира времевия печат (автоматично)?

  4. Как мога да изчисля най-високия % дневни промени в цената с MySQL?

  5. Основна PDO връзка с MySQL