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

テーブルをコンマ値で結合する

    結合を明示的にすることをお勧めします。
    クエリのデバッグと、左結合による内部の変更が容易になります。
    SQL'89の暗黙的な結合構文を使用する正当な理由は絶対にありません。

    SELECT ni.*
           , nf.*
           , group_concat(nm.mailgroup_name) as mailgroups
    FROM newsletter_items ni
    INNER JOIN newsletter_fields nf 
      ON (nf.field_letter_uid = ni.letter_id)
    INNER JOIN newsletter_mailgroups nm  
      ON (find_in_set(nm.mailgroup_id, ni.receivers))
    WHERE  
      nf.field_name = 'letter_headline' 
      ni.template = '". $template ."' 
    GROUP BY ni.letter_id;
    

    データベースの設計について。
    データベースを正規化することをお勧めします。つまり、コンマで区切られたフィールドを別のテーブルに移動します。

    だからあなたはテーブルレシーバーを作ります

    Receivers
    ----------
    id integer auto_increment primary key
    letter_id integer not null foreign key references newsletter_items(letter_id)
    value integer not null
    

    次に、フィールドレシーバーをテーブルnewsletter_itemsから削除します。

    次に、クエリは次のように変わります。

    SELECT ni.*
           , group_concat(r.value) as receivers
           , nf.*
           , group_concat(nm.mailgroup_name) as mailgroups
    
    FROM newsletter_items ni
    INNER JOIN newsletter_fields nf 
      ON (nf.field_letter_uid = ni.letter_id)
    INNER JOIN newsletter_mailgroups nm  
      ON (find_in_set(nm.mailgroup_id, ni.receivers))
    LEFT JOIN receiver r ON (r.letter_id = ni.letter_id)
    WHERE  
      nf.field_name = 'letter_headline' 
      ni.template = '". $template ."' 
    GROUP BY ni.letter_id;
    

    この変更により、クエリも大幅に高速化されます。



    1. MariaDBサーバーをDockerコンテナにデプロイする方法

    2. ClusterControlを使用してMySQLおよびMariaDBデータのポイントインタイムリカバリを実行する方法

    3. Postgresを使用して複数のスキーマからすべてのレコードを選択(取得)します

    4. ClusterControl1.4.1の発表-ProxySQLEdition