Mysql
 sql >> Database >  >> RDS >> Mysql

Unisci tabelle con valori di virgola

Ti consiglio di rendere espliciti i tuoi join.
Semplifica il debug della query e la modifica di inner con i join sinistro.
Non c'è mai una buona ragione per utilizzare la sintassi di join implicito 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;

Per quanto riguarda la progettazione del tuo database.
Ti consiglio di normalizzare il tuo database, ciò significa che sposti i campi separati da virgole in una tabella diversa.

Quindi crei un ricevitore da tavolo

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

Quindi rimuovi il ricevitore di campo dalla tabella newsletter_items

La tua richiesta cambia quindi 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;

Questa modifica dovrebbe anche velocizzare notevolmente la tua query.