MySQL, GROUP_CONCAT и сортировка по WHERE IN

суббота, 19 марта 2011 г.

Появилась необходимость одним запросом к базе получить строку, состоящую из склейки нескольких строк выборки.
То есть нормальная выборка дает три строки
1
2
3
А мне надо получить результат в виде
1/2/3


Для этого в MySQL есть специальная функция GROUP_CONCAT.
Но самое интересное, это то, что надо результат сформировать в зависимости от порядка следования параметров в WHERE IN (...)
Сразу покажу пример. В нём всё довольно понятно

SELECT GROUP_CONCAT(id ORDER BY FIELD(slug,'odin','tree','six','five') SEPARATOR '/' ) as path 
FROM `catalog_categories` 
WHERE slug IN ('odin','tree','six','five');

Таким образом имея таблицу вида
idslug
1odin
2dva
3tree
4four
5five
6six
запрос вернут ответ вида
1/3/6/5 

2 коммент.:

Alex комментирует...

что-то не смог пройти мимо.
1. по поводу самого интересного...
ORDER BY FIELD(slug,'odin','tree','six','five')
т.е. если вдруг захочется поискать 10 значений, то их нужно будет ручками в нужном порядке внести, а захочется 10 других, то опять ручками? Имхо, лучше добавить поле в таблицу, в котором будет нужный порядок указан и уже нормально сортировать order by field_added

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

GIN комментирует...

Alex, подразумевается, что значения в запросе добавляются не ручками, а программно, тем же php. И естесственно дело в ручной сортировке - об этом и речь. )

Copyright © 2010 WEB IT blog