Join tables with comma values

前端 未结 3 575
日久生厌
日久生厌 2020-12-12 05:20

I have a hard nut to crack with joing 3 tables. I have a newsletter_items, newsletter_fields and newsletter_mailgroups which I want to be joined to get a list of newsletters

3条回答
  •  情深已故
    2020-12-12 06:07

    I recommend that you make your joins explicit.
    It makes it easier to debug your query and to change inner with left joins.
    There is absolutely never a good reason to use 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;
    

    Regarding your database design.
    I recommend you normalize your database, that means that you move the comma separated fields into a different table.

    So you make a table receivers

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

    You then remove the field receiver from the table newsletter_items

    Your query then changes into:

    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;
    

    This change should also speed up your query significantly.

提交回复
热议问题