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

Sammensæt tabeller med kommaværdier

Jeg anbefaler, at du gør dine joins eksplicitte.
Det gør det nemmere at fejlsøge din forespørgsel og at ændre indre med venstre joins.
Der er absolut aldrig en god grund til at bruge SQL '89 implicit joinsyntaks.

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;

Med hensyn til dit databasedesign.
Jeg anbefaler, at du normaliserer din database, det betyder, at du flytter de kommaseparerede felter til en anden tabel.

Så du laver et bordmodtagere

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

Du fjerner derefter feltmodtageren fra tabellen newsletter_items

Din forespørgsel ændres derefter til:

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;

Denne ændring bør også fremskynde din forespørgsel betydeligt.



  1. Output mellem to datoer mysql

  2. Opgradere WAMP til MySQL 5.5?

  3. Hentning af data fra RDS giver AttributeError:'sqlalchemy.cimmutabledict.immutabledict'-objektet har ingen attribut 'setdefault'

  4. Sådan opsætter du destinationskatalog for arkivlog i Oracle-databasen