Mysql
 sql >> база данни >  >> RDS >> Mysql

Обединете таблици със стойности на запетая

Препоръчвам ви да направите вашите обединения изрични.
Това улеснява отстраняването на грешки във вашата заявка и промяната на вътрешните с леви съединения.
Никога няма основателна причина да използвате синтаксис на 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;

По отношение на дизайна на вашата база данни.
Препоръчвам ви да нормализирате вашата база данни, което означава, че премествате полетата, разделени със запетая, в друга таблица.

Така че правите приемници на маса

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

След това премахвате получателя на полето от таблицата newsletter_items

След това вашата заявка се променя в:

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;

Тази промяна също трябва да ускори значително вашата заявка.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Списък на MySQL спецификаторите за формат на дата

  2. Стойността на часовата зона на сървъра „AEST“ е неразпозната или представлява повече от една часова зона

  3. Пълнотекстови търсения в MySQL:доброто, лошото и грозното

  4. Как да стартирате PHP скрипта в определено време

  5. CodeIgniter:Съхраняване на изображение в базата данни?