Сгруппировать по имени, но сохранить все теги, связанные с именем

Мне было интересно, сталкивался ли кто-нибудь со следующим:

SQL-запрос:

SELECT s.ID , s.name , s.artist, m.tag_ID, t.name, s.*, m.*, t.*
                FROM lms_song s
                LEFT JOIN lms_map m
                ON s.ID = m.ID
                LEFT JOIN lms_tag t 
                ON m.tag_id = t.ID
                WHERE s.created_by='.$userId.'                                  
                ORDER BY '.$Field.' '.$Direction;

PHP:

<? foreach($this->songs AS $song){ ?>
<tr>
    <td>

        <?php echo $song->songName;?>

    </td>
    <td>
        <?php echo $song->artist;?>
    </td>

    <td>        
        <?php echo $song->tagname;?>

    </td>
</tr>

В настоящее время он отображает все «песни», перечисленные пользователем.

Хотя в нем перечислены все песни, связанные с пользователем, в нем есть несколько дубликатов названий песен, поскольку с каждым названием песни связан тег.

Я попытался просто отобразить «Группировать по s.name» для «названия песни».

Однако это ограничивает его одним t.name (тегом).

Я хочу не отображать дубликаты названия песни (s.name) каждого исполнителя (s.artist), отображая при этом все теги (t.name), связанные с ним.

Любая помощь приветствуется.

Спасибо!


person Nina    schedule 18.12.2013    source источник
comment
Попробуйте использовать GROUP_CONCAT   -  person Jessica    schedule 19.12.2013


Ответы (1)


Я думаю, вы ищете group_concat() с group by:

SELECT s.ID , s.name , s.artist,
       group_concat(m.tag_ID) as tagids,
       group_concat(t.name) as tagnames
FROM lms_song s LEFT JOIN
     lms_map m
     ON s.ID = m.ID LEFT JOIN 
     lms_tag t 
     ON m.tag_id = t.ID
WHERE s.created_by='.$userId.'
GROUP BY s.ID, s.name , s.artist                                 
ORDER BY '.$Field.' '.$Direction;
person Gordon Linoff    schedule 18.12.2013
comment
Благодарю вас! Group_concat — идеальное решение. Я отмечу это как ответ, как только смогу (там написано, что мне нужно подождать 10 минут...) - person Nina; 19.12.2013