Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Verknüpfen Sie Tabellen mit Kommawerten

Ich empfehle Ihnen, Ihre Joins explizit zu machen.
Das macht es einfacher, Ihre Abfrage zu debuggen und innere mit linken Joins zu ändern.
Es gibt absolut keinen guten Grund, die implizite Join-Syntax von SQL '89 zu verwenden.

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;

In Bezug auf Ihr Datenbankdesign.
Ich empfehle Ihnen, Ihre Datenbank zu normalisieren, dh Sie verschieben die kommagetrennten Felder in eine andere Tabelle.

So machen Sie einen Tischempfänger

Receivers
----------
id integer auto_increment primary key
letter_id integer not null foreign key references newsletter_items(letter_id)
value integer not null

Anschließend entfernen Sie das Feld Empfänger aus der Tabelle newsletter_items

Ihre Abfrage ändert sich dann in:

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;

Diese Änderung sollte auch Ihre Abfrage erheblich beschleunigen.