SELECT * FROM user LIMIT (SELECT group_limit FROM groups WHERE groupid = 7471);
这来自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;
从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);
如果您使用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