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

MySQLで区切られたデータを選択

    上記のStrawberryのコメントが示すように、これを行う方法はありますが、それはとても醜いです。それは、ダクトテープを使用して高価なキッチンの改造を終えるようなものです。このようにデータベースを設計した人に憤慨するはずです。

    SELECT g.id_group, GROUP_CONCAT(n.Names SEPARATOR ' ') AS Names
    FROM groups AS g JOIN names AS n
      ON FIND_IN_SET(n.id_names, REPLACE(g.Name, '|', ','))
    GROUP BY g.id_group;
    

    出力、MySQL 5.6でテスト済み:

    +----------+---------------+
    | id_group | Names         |
    +----------+---------------+
    |        1 | Joe Mary Bill |
    |        2 | Fred Mary     |
    |        3 | Jack Joe      |
    +----------+---------------+
    

    このクエリの複雑さと、テーブルスキャンを強制されて最適化できないという事実から、IDのリストを区切り文字列に保存することの何が問題になっていますか

    より良い解決策は、グループの個々のメンバーを単独で行に格納する3番目のテーブルを作成することです。つまり、グループごとに複数の行があります。

    CREATE TABLE group_name (
      id_group INT NOT NULL,
      id_name INT NOT NULL,
      PRIMARY KEY (id_group, id_name)
    );
    

    次に、より簡単な方法でクエリを実行でき、クエリを非常に高速にするためのインデックスを作成する機会があります。

    SELECT id_group, GROUP_CONCAT(names SEPARATOR ' ') AS names
    FROM groups
    JOIN group_name USING (id_group)
    JOIN names USING (id_name)
    


    1. エラーを修正する方法:列c.relhasoidsはPostgresに存在しませんか?

    2. SQLServerのMINおよびMAX集計関数

    3. MySQL –現在のユーザーを知るためのさまざまな方法

    4. 別のサーバー上のデータベースに接続する方法