Jag rekommenderar att du gör dina joins explicita.
Det gör det enklare att felsöka din fråga och ändra inre med left joins.
Det finns absolut aldrig en bra anledning att använda SQL '89 implicit join-syntax.
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;
Angående din databasdesign.
Jag rekommenderar att du normaliserar din databas, det betyder att du flyttar de kommaseparerade fälten till en annan tabell.
Så du gör en bordsmottagare
Receivers
----------
id integer auto_increment primary key
letter_id integer not null foreign key references newsletter_items(letter_id)
value integer not null
Du tar sedan bort fältmottagaren från tabellen newsletter_items
Din fråga ändras sedan till:
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;
Denna ändring bör också påskynda din fråga avsevärt.