首页 > 解决方案 > 为什么 LIMIT 和 OFFSET 在 mysql 脚本中不起作用?

问题描述

我正在尝试以下 mysql 脚本,但它说NumOfRecordsOffsetpage没有定义。

SET @NumOfRecords = 10;
SET @Offsetpage = 0;
SET @DocumentStatus = 'PENDING';
SELECT * FROM documents WHERE DOCUMENT_VERIFICATION_STATUS = @DocumentStatus ORDER BY DOCUMENT_UPLOADED_DATE DESC LIMIT @NumOfRecords OFFSET @Offsetpage

有什么帮助吗?

标签: mysql

解决方案


LIMIT不支持子句中的用户变量。

https://dev.mysql.com/doc/refman/8.0/en/user-variables.html说:

用户变量可以在大多数允许表达式的情况下使用。这目前不包括明确需要文字值的上下文,例如在语句的LIMIT子句SELECT或语句的IGNORE N LINES子句中LOAD DATA

换句话说,您必须使用文字整数,否则您可以使用准备好的语句:

PREPARE stmt FROM 'SELECT * FROM documents WHERE DOCUMENT_VERIFICATION_STATUS = ? ORDER BY DOCUMENT_UPLOADED_DATE DESC LIMIT ? OFFSET ?';
EXECUTE stmt USING @DocumentStatus, @NumOfRecords, @Offsetpage;

您不必为此使用存储过程,您可以直接在任何数据库会话中执行准备好的语句。

您可以直接在大多数客户端 API 中运行准备好的语句,而无需使用PREPAREandEXECUTE语法。您也不必定义用户变量。

例如,在 PHP 中:

<?php

$stmt = $pdo->prepare('SELECT * FROM documents WHERE DOCUMENT_VERIFICATION_STATUS = ? ORDER BY DOCUMENT_UPLOADED_DATE DESC LIMIT ? OFFSET ?');
$stmt->execute( [ 'PENDING', 10, 0 ] );

推荐阅读