如何获得用逗号分隔的十个值列表,而不是全部?

问题描述 投票:0回答:2

我需要将一组动态行更新为给定值,并且我在以下查询中认为::

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 [GLOBAL | SESSION] group_concat_max_len = val;其中val是无符号整数。

但是请注意,返回值的有效最大长度为本身受max_allowed_pa​​cket值的约束。

但是要这样做:

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作为逗号分隔值的正确方法是什么?

mysql limit group-concat mysql-5.7
2个回答
0
投票

max length parameter引用GROUP_CONCAT结果的字节,而不是输入中的项目。

类似地,将限制应用于之后分组,因此不会影响限制本身。 SQL如何应用其子句有一个defined ordering,GROUP BY相对较早,而LIMIT最晚。

您可以使用子查询来完成限制,然后在其外部应用GROUP_CONCAT,例如:

SELECT GROUP_CONCAT(n.id) FROM (SELECT id FROM tbl_names ORDER BY 1 LIMIT 10) AS n;

0
投票

SUBSTRING_INDEX()SUBSTRING_INDEX()用作3d参数:

10
© www.soinside.com 2019 - 2024. All rights reserved.