Concatenate several fields into one with SQL

后端 未结 6 1786
再見小時候
再見小時候 2021-02-10 09:54

I have three tables tag, page, pagetag

With the data below

page

ID      NAME
1           


        
相关标签:
6条回答
  • 2021-02-10 10:17

    Sergio del Amo:

    However, I am not getting the pages without tags. I guess i need to write my query with left outer joins.

    SELECT pagetag.id, page.name, group_concat(tag.name)
    FROM
    (
        page LEFT JOIN pagetag ON page.id = pagetag.pageid
    )
    LEFT JOIN tag ON pagetag.tagid = tag.id
    GROUP BY page.id;
    

    Not a very pretty query, but should give you what you want - pagetag.id and group_concat(tag.name) will be null for page 4 in the example you've posted above, but the page shall appear in the results.

    0 讨论(0)
  • 2021-02-10 10:20

    I got a solution playing with joins. The query is:

    SELECT
        page.id AS id,
        page.name AS name,
        tagstable.tags AS tags
    FROM page 
    LEFT OUTER JOIN 
    (
        SELECT pagetag.pageid, GROUP_CONCAT(distinct tag.name) AS tags
        FROM tag INNER JOIN pagetag ON tagid = tag.id
        GROUP BY pagetag.pageid
    )
    AS tagstable ON tagstable.pageid = page.id
    GROUP BY page.id
    

    And this will be the output:

    id   name    tags
    ---------------------------
    1    page 1  tag2,tag3,tag1
    2    page 2  tag1,tag3
    3    page 3  tag4
    4    page 4  NULL
    

    Is it possible to boost the query speed writing it another way?

    0 讨论(0)
  • 2021-02-10 10:20

    Yep, you can do it across the 3 something like the below:

    SELECT page_tag.id, page.name, group_concat(tags.name)
    FROM tag, page, page_tag
    WHERE page_tag.page_id = page.page_id AND page_tag.tag_id = tag.id;
    

    Has not been tested, and could be probably be written a tad more efficiently, but should get you started!

    Also, MySQL is assumed, so may not play so nice with MSSQL! And MySQL isn't wild about hyphens in field names, so changed to underscores in the above examples.

    0 讨论(0)
  • 2021-02-10 10:27

    As far as I'm aware SQL92 doesn't define how string concatenation should be done. This means that most engines have their own method.

    If you want a database independent method, you'll have to do it outside of the database.

    (untested in all but Oracle)

    Oracle

    SELECT field1 | ', ' | field2
    FROM table;
    

    MS SQL

    SELECT field1 + ', ' + field2
    FROM table;
    

    MySQL

    SELECT concat(field1,', ',field2)
    FROM table;
    

    PostgeSQL

    SELECT field1 || ', ' || field2
    FROM table;
    
    0 讨论(0)
  • 2021-02-10 10:40

    I think you may need to use multiple updates.

    Something like (not tested):

    select ID as 'PageId', Name as 'PageName', null as 'Tags'
    into #temp 
    from [PageTable]
    
    declare @lastOp int
    set @lastOp = 1
    
    while @lastOp > 0
    begin
        update p
        set p.tags = isnull(tags + ', ', '' ) + t.[Tagid]
        from #temp p
            inner join [TagTable] t
                on p.[PageId] = t.[PageId]
        where p.tags not like '%' + t.[Tagid] + '%'
    
        set  @lastOp == @@rowcount
    end
    
    select * from #temp
    

    Ugly though.

    That example's T-SQL, but I think MySql has equivalents to everything used.

    0 讨论(0)
  • 2021-02-10 10:42

    pagetag.id and group_concat(tag.name) will be null for page 4 in the example you've posted above, but the page shall appear in the results.

    You can use the COALESCE function to remove the Nulls if you need to:

    select COALESCE(pagetag.id, '') AS id ...
    

    It will return the first non-null value from it's list of parameters.

    0 讨论(0)
提交回复
热议问题