मेरा सुझाव है कि आप अपने जॉइन को स्पष्ट करें।
यह आपकी क्वेरी को डिबग करना और लेफ्ट जॉइन के साथ इनर को बदलना आसान बनाता है।
एसक्यूएल '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;
इस बदलाव से आपकी क्वेरी में भी काफी तेजी आनी चाहिए।