sql >> Database >  >> RDS >> Mysql

Tabellen samenvoegen met kommawaarden

Ik raad je aan om je joins expliciet te maken.
Het maakt het gemakkelijker om fouten op te sporen in je query en om inner joins te wijzigen met left joins.
Er is absoluut nooit een goede reden om de impliciete join-syntaxis van SQL '89 te gebruiken.

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;

Wat betreft uw database-ontwerp.
Ik raad u aan uw database te normaliseren, dat betekent dat u de door komma's gescheiden velden naar een andere tabel verplaatst.

Dus je maakt een tafelontvanger

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

U verwijdert dan de veldontvanger uit de tabel newsletter_items

Uw zoekopdracht verandert dan 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;

Deze wijziging zou uw zoekopdracht ook aanzienlijk moeten versnellen.



  1. Aankondiging van Barman 1.0, Backup and Recovery Manager voor PostgreSQL

  2. MAX() Functie in PostgreSQL

  3. Schending van UNIQUE KEY-beperking op INSERT WHERE COUNT(*) =0 op SQL Server 2005

  4. invoegen indien niet bestaat anders selecteer gewoon in mysql