MySQL GROUP_CONCAT и JOIN - PullRequest
       101

MySQL GROUP_CONCAT и JOIN

0 голосов
/ 21 июня 2020

Таблица носителей:

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

Пример таблицы:

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

Таблица категорий:

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`)
}

тип может быть 'категорией' или 'тегом' ( Я предполагаю, что это может быть перечисление)

Пример таблицы:

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

Я пытаюсь использовать GROUP_CONCAT как для категории, так и для тега из $ media_taxonomy_table.

Этот запрос вернет 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

Полученные результаты:

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

ожидается (мне тоже нужен тег):

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

Ответы [ 2 ]

3 голосов
/ 21 июня 2020

Вы можете выполнить условную агрегацию:

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
0 голосов
/ 21 июня 2020

Кажется, вам нужен еще один 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
...