Появилась необходимость одним запросом к базе получить строку, состоящую из склейки нескольких строк выборки.
То есть нормальная выборка дает три строки
1
2
3
А мне надо получить результат в виде
1/2/3
Для этого в MySQL есть специальная функция GROUP_CONCAT.
Но самое интересное, это то, что надо результат сформировать в зависимости от порядка следования параметров в WHERE IN (...)
Сразу покажу пример. В нём всё довольно понятно
Таким образом имея таблицу вида
запрос вернут ответ вида
То есть нормальная выборка дает три строки
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');
Таким образом имея таблицу вида
id | slug |
---|---|
1 | odin |
2 | dva |
3 | tree |
4 | four |
5 | five |
6 | six |
1/3/6/5
2 коммент.:
что-то не смог пройти мимо.
1. по поводу самого интересного...
ORDER BY FIELD(slug,'odin','tree','six','five')
т.е. если вдруг захочется поискать 10 значений, то их нужно будет ручками в нужном порядке внести, а захочется 10 других, то опять ручками? Имхо, лучше добавить поле в таблицу, в котором будет нужный порядок указан и уже нормально сортировать order by field_added
2. опять же использование group_concat вместо concat_ws в таком примере, когда нет группировки, оправдывает только ручная сортировка
Alex, подразумевается, что значения в запросе добавляются не ручками, а программно, тем же php. И естесственно дело в ручной сортировке - об этом и речь. )
Отправить комментарий