如何编写带有动态LIMIT的SQL查询

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

SELECT * FROM user LIMIT (SELECT group_limit FROM groups WHERE groupid = 7471);

mysql sql limit
3个回答
11
投票

这来自MySQL数据库知识库

LIMIT 子句可用于限制 SELECT 语句返回的行数。 LIMIT 接受一个或两个数字参数,它们必须都是非负整数常量(使用准备好的语句时除外)。

为了使查询正常工作,您需要将其编写为准备好的语句,然后执行它。

SET @a = (SELECT group_limit FROM groups WHERE groupid = 7471);

PREPARE STMT FROM 'SELECT * FROM user LIMIT ?';
EXECUTE STMT USING @a;

0
投票

MySQL 8.0.2开始,支持ROW_NUMBER()窗口函数。在子查询的帮助下,这意味着您可以做一些接近问题所要求的事情:

SELECT * FROM (
  SELECT ROW_NUMBER() OVER(PARTITION BY 1) rownum, u.* FROM user u
) t 
WHERE t.rownum <= (SELECT group_limit FROM groups WHERE groupid = 7471);

10.2.0 起,MariaDB 也支持此功能。


0
投票

如果您使用MariaDB,则可以使用序列表来实现此目的。

SELECT
    u.*
FROM
    user u
INNER JOIN 
    seq_0_to_999999 lim
ON
    lim.seq < (SELECT group_limit FROM groups WHERE groupid = 7471)

根据您的数据库结构,您甚至可以通过加入组表而不是使用子查询来进一步简化,但我还没有测试哪个更快。

不幸的是,我找不到这方面的官方 MariaDB 文档,但我在生产代码中使用了序列表。它也用在这个SO答案中:https://dba.stackexchange.com/a/264109/252546

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