сряда, 5 септември 2007 г.

Списък, разделен със запетаи от MySQL заявка?

Днес бях приятно изненадан от MySQL. Обикновено, както често се случва във вицовете за Щирлиц, MySQL ме изненадва... хм... неприятно. Но днес не е такъв ден! Исках резултата от една MySQL заявка да го превърна в списък разделен със запетаи. Заявката връща списък с ID-та, които искам да ги ползвам във DELETE ... WHERE ID IN (...) заявки. Оказа се, че има групиращ функция (от MySQL 4.1 нататък) - GROUP_CONCAT(). Веднага пример:

mysql> SELECT GROUP_CONCAT(id) FROM users;
+-------------------------------+
| GROUP_CONCAT(id) |
+-------------------------------+
| 2358,2360,2362,2366,2368,2376 |
+-------------------------------+
1 row in set (0.00 sec)

Готино! :)

Редакция:
Една малка особеност на GROUP_CONCAT - оказа се, че върнатия резултат е VARCHAR, следователно списъка не може да бъде по-голям от 255 символа. За да се преодолее това ограничение е достатъчно да изпълните:

mysql> SET SESSION group_concat_max_len = 20000;

4 коментара:

Павел Георгиев каза...

За конкретния случай няма смисъл от GROUP_CONCAT(), може да ползваш направо:

DELETE ... WHERE ID IN (SELECT id FROM users);


Готин блог, btw!

Свилен Иванов каза...

Да, ама не! (съжалявам за клишето). MySQL е друг тип животно - нищо общо със северния елен. Цитирам:

Currently, you cannot delete from a table and select from the same table in a subquery.

Krasio каза...

Ей, благодарско..тва за GROUP_CONCAT() го бях чел преди много време в нечий блог..и наскоро като ми трябваше само смътно си споних че има такова животно но не можах да го намеря(макар че се порових из ръководството). Бутам блога в GReader-а и вече ще има как до го възстановя ако пак успея да го забравя :)

Свилен Иванов каза...

@krasio

И аз така - все го забравям. Редактирах публикацията за една малка особеност, с която се сблъсках снощи.