結合を明示的にすることをお勧めします。
クエリのデバッグと、左結合による内部の変更が容易になります。
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;
この変更により、クエリも大幅に高速化されます。