sql >> Databáze >  >> RDS >> Mysql

Spojte tabulky s hodnotami čárkami

Doporučuji, abyste svá spojení udělali explicitně.
Usnadňuje to ladění dotazu a změnu vnitřního pomocí levých spojení.
Absolutně nikdy není dobrý důvod používat syntaxi implicitního spojení 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;

Pokud jde o návrh vaší databáze.
Doporučuji vám normalizovat databázi, to znamená, že přesunete pole oddělená čárkami do jiné tabulky.

Takže uděláte stolní přijímače

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

Poté odeberete přijímač pole z tabulky newsletter_items

Váš dotaz se poté změní na:

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;

Tato změna by také měla výrazně urychlit váš dotaz.



  1. mysql PDO a dynamická SQL injekce uložená procedura

  2. Použití klauzule EXCEPT v PostgreSQL

  3. MySQL je pomalé při připojení. Jakýkoli způsob, jak urychlit

  4. Import GeoLite2 od MaxMind do MySQL