sql >> Databasteknik >  >> RDS >> Mysql

Slå samman tabeller med kommavärden

Jag rekommenderar att du gör dina joins explicita.
Det gör det enklare att felsöka din fråga och ändra inre med left joins.
Det finns absolut aldrig en bra anledning att använda SQL '89 implicit join-syntax.

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;

Angående din databasdesign.
Jag rekommenderar att du normaliserar din databas, det betyder att du flyttar de kommaseparerade fälten till en annan tabell.

Så du gör en bordsmottagare

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

Du tar sedan bort fältmottagaren från tabellen newsletter_items

Din fråga ändras sedan till:

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;

Denna ändring bör också påskynda din fråga avsevärt.



  1. MySQL INSERT ... PÅ DUBLIKATNYCKELUPPDATERING på Java:Hur man skiljer tillstånden infogade/uppdaterade/NoChange

  2. Hur hämtar jag kommentaren från en PostgreSQL-databas?

  3. Hur man skapar en tom databas i Access 2016

  4. MySQL DELETE FROM med subquery som villkor