Препоръчвам ви да направите вашите обединения изрични.
Това улеснява отстраняването на грешки във вашата заявка и промяната на вътрешните с леви съединения.
Никога няма основателна причина да използвате синтаксис на 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;
Тази промяна също трябва да ускори значително вашата заявка.