Поиск по этому блогу

октября 29, 2009

GROUP_CONCAT

Надо было вывести список тем для которых пользователь оставил тэги, и список самих тэгов, оставленных этим пользователем к каждой теме... Вот такой запросик получался
SELECT tt.threadid,t.title,tg.tagid,tg.tagtext AS tags
        FROM ".TABLE_PREFIX."tag AS tg
        LEFT JOIN ".TABLE_PREFIX."tagthread AS tt ON (tg.tagid=tt.tagid)
        LEFT JOIN ".TABLE_PREFIX."thread AS t ON (t.threadid=tt.threadid)
        WHERE tt.userid =".$db->escape_string($vbulletin->GPC['u'])."
        GROUP BY tt.threadid

Но т.к. шла группировка по id темы - соответственно выводилась только одна, первая метка... а надо все... Долго мучала, пыталась с подзапросом сделать, с CONCAT_WS() и вот наткнулась на эту спасительную функцию, которая работает так же как и concat_ws, (которая просто строки объединяет с разделителем), но умеет объединять результаты выборки из таблицы
Добавляем функцию, и ап
SELECT tt.threadid,t.title,tg.tagid,GROUP_CONCAT(tg.tagtext) AS tags  
FROM ".TABLE_PREFIX."tag AS tg

LEFT JOIN ".TABLE_PREFIX."tagthread AS tt ON (tg.tagid=tt.tagid)

LEFT JOIN ".TABLE_PREFIX."thread AS t ON (t.threadid=tt.threadid)

WHERE tt.userid =".$db->escape_string($vbulletin->GPC['u'])."

GROUP BY tt.threadid

Получаем нужный результат

Подробнее об особенностях этой функции можно прочесть например тут http://webi.ru/webi_articles/8_14_f.html