Мне нужно обновить набор динамических строк до заданного значения, и я подумал в следующем запросе: *
UPDATE tbl_names n
SET n.queue_id = (SELECT MAX(id) FROM tbl_queue ORDER BY 1 DESC)
WHERE n.id IN (SELECT nm.id FROM tbl_names nm ORDER BY 1 DESC LIMIT 10)
Но используемая версия MySQL не позволяет LIMIT
в подзапросах:
SHOW VARIABLES LIKE "%version%";
+----------------+--------+
| Variable_name | Value |
+----------------+--------+
| innodb_version | 5.7.27 |
| version | 5.7.27 |
+----------------+--------+
Тогда я подумал о создании переменных и назначил им результат подзапросов как:
SET @queueId = (SELECT MAX(id) FROM tbl_queue q ORDER BY 1 DESC);
SET @nameIds = (SELECT GROUP_CONCAT(n.id) FROM tbl_names n ORDER BY 1 DESC LIMIT 10);
UPDATE cases c SET c.queue_id=@queueId WHERE c.id IN (@nameIds);
Но проблема в GROUP_CONCAT
не относится к LIMIT
и возвращает все идентификаторы из таблицы.
Я знаю из здесь следующее:
При использовании GROUP_CONCAT () важно знать, что результат усекается домаксимальная длина, предоставляемая системной переменной group_concat_max_len со значением по умолчанию 1024.
Значение этой переменной можно установить выше, используя следующий синтаксис:
SET [GLOBAL |СЕССИЯ] group_concat_max_len = val;Где val - целое число без знака.
Однако обратите внимание, что эффективная максимальная длина возвращаемого значения сама ограничена значением max_allowed_packet.
Но при этом:
SET SESSION group_concat_max_len = 10;
SET @nameIds = (SELECT GROUP_CONCAT(n.id) FROM tbl_names n ORDER BY 1 DESC);
SELECT @nameIds;
Возвращает только один идентификатор, а не 10, как я ожидал. Что я делаю не так? Наверное, я неправильно понимаю, как работает group_concat_max_len
. Как правильно получить только 10 идентификаторов в виде значений, разделенных запятыми?