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

1つのシリアル化されたデータで2つの列を結合するにはどうすればよいですか?

    MySQLはPHPシリアル化が何であるかを知りません。カテゴリのIDは、次の形式の文字列として保存できます。

    2,4,5,10,...
    

    次に、 SUBSTRING_INDEX()を組み合わせて使用​​します。 および FIND_IN_SET()> MySQLはcategories.idの存在をチェックするように機能します ecommerce_products.catid内 :

    SUBSTRING_INDEX(
        SUBSTRING_INDEX(ecommerce_products.catid,
            ',',
            FIND_IN_SET(categories.id, ecommerce_products.catid)
    ), ',', -1)
    

    各製品レコードのカテゴリタイトルを選択するには、タイトルを GROUP_CONCAT() 関数なので、最終的なクエリは次のようになります。

    SELECT p.id,
           p.catid
           GROUP_CONCAT(cat.title ORDER BY cat.id SEPARATOR '|') as 'categories',
           p.manid,
           p.name
    FROM ecommerce_products AS p
    LEFT JOIN categories AS cat
        ON cat.id = SUBSTRING_INDEX(SUBSTRING_INDEX(p.catid, ',', FIND_IN_SET(cat.id, p.catid)), ',', -1)
    -- more query...
    GROUP BY p.id; -- Group the result to concatenate the categories titles
    

    このアプローチでは、 $this->db->query(); クエリを手動で実行するメソッド。

    注:
    別の方法として、ONに次を使用できます ステートメント:

    LEFT JOIN categories AS cat
        ON p.catid REGEXP CONCAT('[,]{0,1}', cat.id, '[,]{0,1}')
    

    テストケース

    これがSQLFiddle での私のテストケースです。

    SELECT p.id,
           p.name,
           GROUP_CONCAT(c.title ORDER BY c.id SEPARATOR '|') as 'categories'
    FROM products as p
    JOIN categories as c
      ON c.id = SUBSTRING_INDEX(SUBSTRING_INDEX(p.cat_id, ',', FIND_IN_SET(c.id, p.cat_id)) , ',', -1)
    GROUP BY p.id;
    

    結果:

    ID    NAME          CATEGORIES
    --    ---------     -----------
    1     Product 1     Cat 1|Cat 3
    2     Product 2     Cat 2|Cat 4
    3     Product 3     Cat 1|Cat 4
    4     Product 4     Cat 2|Cat 3
    


    1. SQL ServerのDATALENGTH()とは何ですか?

    2. SQLエラー:ORA-14006:無効なパーティション名

    3. MySQLサーバーをNetBeansに接続する

    4. 外部キーの制約により、MySQLテーブルを削除できません