Tôi khuyên bạn nên đặt các phép nối của mình một cách rõ ràng.
Điều này giúp dễ dàng gỡ lỗi truy vấn của bạn và thay đổi bên trong bằng các phép nối bên trái.
Hoàn toàn không có lý do chính đáng để sử dụng cú pháp liên kết ngầm định của 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;
Về thiết kế cơ sở dữ liệu của bạn.
Tôi khuyên bạn nên bình thường hóa cơ sở dữ liệu của mình, nghĩa là bạn di chuyển các trường được phân tách bằng dấu phẩy sang một bảng khác.
Vì vậy, bạn tạo một bộ thu bảng
Receivers
----------
id integer auto_increment primary key
letter_id integer not null foreign key references newsletter_items(letter_id)
value integer not null
Sau đó, bạn xóa bộ thu trường khỏi bảng newsletter_items
Sau đó truy vấn của bạn thay đổi thành:
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;
Thay đổi này cũng sẽ tăng tốc truy vấn của bạn đáng kể.