sql >> データベース >  >> RDS >> Mysql

MySQL:列に複数のIDが含まれている場合、左結合でデータをフェッチするにはどうすればよいですか?

    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間で異なる場合があります item)、追加のrankを作成する必要があります InfoTargetsの列 。




    1. MySQL ORDER BY x-y / x ASC

    2. SQLServer2000-リンクサーバー

    3. Laravel PDOException SQLSTATE[HY000][1049]不明なデータベース'forge'

    4. インポートエクスポートmysqlデータベースコマンドライン超高速