Как стать автором
Обновить

Комментарии 11

Как бы там и while есть и еще много чего, что узнает человек зайдя на сайт с документацией по mysql
Собственно сам этого не знал. Но все таки под названия темы подходит. Вполне простейший цикл, причем работающий при условии заданном в запросе. Думаю найдутся люди, для которых эта статья будут полезна. Вот еще и о While узнают в комментариях. Насколько я понимаю, в данном случае он не подошел бы.
Зачем еще и подзапрос? Можно и так:
UPDATE `table` SET `name`=CONCAT('Проект ', @i := @i+1) WHERE `type` = 1 ORDER BY `id`;


А насчет цикла, я где то в интернете натыкался на организацию цикла с помощью Benchmark, правда он не подойдет для запросов типа UPDATE. А то, что вы называете циклом в вашей статье, как то слабо на него похоже, это всего лишь обычный способ использовать переменные.
Спасибо исправил. Но все таки при поиске проблемы люди будут искать именно цикл при изменении записей. А хабр хорошо индексируется в поисковиках. Если еще побольше информации в циклах в mysql наберется в комментариях…
Америку конечно лично мне не открыли, с помощью переменных действительно многое удобно делать.
Хочу привести ещё один пример, посложнее, применения переменных в запросе:
Выборка вложенного в одно поле параметра
Иногда для хранения различных характеристик товара, чтобы не плодить громадных таблиц, удобно записать набор параметров прямо в поле `params` таблицы, в виде '|key:value|key:value|key:value|...|'.
Поиск по определённому параметру примитивен, используя LIKE:
SELECT `id` FROM `table` WHERE `params` LIKE '%|partam1:100500|%'

Но когда встал вопрос выборки по какому-то одному параметру, тут уже начинаются сложности. Например вывести список значений параметра param1. Можно конечно обойтись без переменных, но тогда запрос будет сложнее. На помощь приходят переменные:
SELECT DISTINCT
	SUBSTRING(`params`, @start, LOCATE('|', `params`, @start)-@start) as 'val'
FROM
	`table`, (select @start:=0) s
WHERE
		`params` LIKE '%|param1:%'
		&& (@start := LOCATE('|param1:', `params`)+LENGTH('|param1:')) is not null

трэш какой
На сколько я помню, в таком поиске не будет работать индекс и, как следствие, резко упадет производительность.
Да проблемы с производительностью тут естественно есть, поэтому использовать такие конструкции нужно в «правильных местах» и с умом, т. к. индексы не используются.
Я например этот запрос применял для вывода таблицы параметров одного товара (товар был специфичный, маслостанции, у каждого товара «подтоваров» с разными параметрами — вольтаж, объём бака, производительность).
Для вывода таблицы параметров всей группы товаров используется этот запрос (плюс для сбережения производительности используется кэш).
Кстати мерил производительность, в данном случае она мало различается, т. к. сделать манипуляции над небольшим количеством строк получалось быстрее, чем осуществлять поиск в большой таблице (пусть и с индексами).
Только это не цикл, а эмуляция ROW_NUMBER().
Но поиск в сети, как сделать цикл в MySQL, ничего мне не дал.

Странно как-то вы искали. В следующий раз идите сразу в доку. Flow Control Statements
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации