简体   繁体   English

MySQL GROUP_CONCAT 和加入

[英]MySQL GROUP_CONCAT and JOIN

Media table:媒体表:

CREATE TABLE $media_table (
            `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
            `title` varchar(300) DEFAULT NULL,
            `options` longtext DEFAULT NULL,
            PRIMARY KEY (`id`)
}

Table example:表格示例:

id    title     options
--------------------------
1     video      ...         
2     video      ...         
3     audio      ... 
   

Category table:类别表:

CREATE TABLE $media_taxonomy_table ( 
            `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
            `type` varchar(15) DEFAULT NULL,
            `title` varchar(300) DEFAULT NULL,
            `media_id` int(11) unsigned DEFAULT NULL,
            PRIMARY KEY (`id`),
            INDEX `media_id` (`media_id`)
}

type can be 'category' or 'tag' (I guess this could be enum)类型可以是“类别”或“标签”(我猜这可能是枚举)

Table example:表格示例:

id    type         title      media_id
---------------------------------------
1     category      rock         1  
2     category      trance       1 
3     category      trance       2 
4     category      rock         3
5     tag           silent       1
5     tag           loud         1
6     tag           foo          2

I am trying to GROUP_CONCAT on both category and tag from $media_taxonomy_table.我正在尝试对 $media_taxonomy_table 中的类别和标签进行 GROUP_CONCAT。

This query will return GROUP_CONCAT with only category此查询将返回仅包含类别的 GROUP_CONCAT

SELECT mt.id, mt.title, mt.options, GROUP_CONCAT(mtt.title ORDER BY mtt.title ASC SEPARATOR ', ') as category 
    FROM $media_table as mt
    LEFT JOIN $media_taxonomy_table as mtt 
    ON mt.id = mtt.media_id AND mtt.type='category'
    WHERE playlist_id = %d 
    GROUP BY mt.id

Results, received:结果,收到:

id    title         options     category
----------------------------------------
1     video           ...       rock, trance  
2     video           ...       trance  
3     audio           ...       rock

expected (I need tag as well):预期(我也需要标签):

id    title         options     category          tag
--------------------------------------------------------------
1     video           ...       rock, trance      silent, load
2     video           ...       trance            foo
3     audio           ...       rock

You can do conditional aggregation:您可以进行条件聚合:

SELECT 
    mt.id, 
    mt.title, 
    mt.options, 
    GROUP_CONCAT(CASE WHEN mtt.type = 'category' THEN mtt.title END ORDER BY mtt.title SEPARATOR ', ') as categories,
    GROUP_CONCAT(CASE WHEN mtt.type = 'tag'      THEN mtt.title END ORDER BY mtt.title SEPARATOR ', ') as tags
FROM $media_table as mt
LEFT JOIN $media_taxonomy_table as mtt ON mt.id = mtt.media_id
WHERE mt.playlist_id = %d 
GROUP BY mt.id, mt.title, mt.options

Seems you need another group_concat so you need another join似乎你需要另一个 group_concat 所以你需要另一个加入

SELECT mt.id
    , mt.title
    , mt.options
    , GROUP_CONCAT(mtt.title ORDER BY mtt.title ASC SEPARATOR ', ') as category 
    , GROUP_CONCAT(mtt2.title ORDER BY mtt.title ASC SEPARATOR ', ') as tag 
FROM $media_table as mt
LEFT JOIN $media_taxonomy_table as mtt 
ON mt.id = mtt.media_id AND mtt.type='category'
LEFT JOIN $media_taxonomy_table as mtt2 
ON mt.id = mtt.media_id AND mtt.type='tag'
WHERE playlist_id = %d 
GROUP BY mt.id

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM