Как получить список из десяти значений, разделенных запятыми, а не всех? - PullRequest
0 голосов
/ 11 октября 2019

Мне нужно обновить набор динамических строк до заданного значения, и я подумал в следующем запросе: *

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 идентификаторов в виде значений, разделенных запятыми?

1 Ответ

1 голос
/ 11 октября 2019

Используйте SUBSTRING_INDEX() с 10 в качестве аргумента 3d:

SELECT SUBSTRING_INDEX(GROUP_CONCAT(n.id), ',', 10) FROM tbl_names n
...