我需要将一组动态行更新为给定值,我在以下查询中认为:
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
,并且正在从表中返回所有ID。
我从here了解到以下信息:
使用GROUP_CONCAT()时需要注意的一件事 是结果被截断为所提供的最大长度 通过group_concat_max_len系统变量,它具有默认值 之1024。
可以使用以下方法将此变量的值设置得更高 语法:
SET [全球| SESSION] 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;
仅返回一个ID,而不是我期望的10。我做错了什么?我想我误会了group_concat_max_len
的工作方式。正确获取仅10个ID作为逗号分隔值的正确方法是什么?
答案 0 :(得分:1)
使用SUBSTRING_INDEX()
和10
作为3d参数:
SELECT SUBSTRING_INDEX(GROUP_CONCAT(n.id), ',', 10) FROM tbl_names n