【问题标题】:Is it possible to paginate queries using OFFSET with multiplication?是否可以使用带有乘法的 OFFSET 对查询进行分页?
【发布时间】:2019-06-10 18:33:26
【问题描述】:

是否可以在查询中将两个数字相乘以对 MYSQL 查询进行分页?

SELECT * FROM Posts
LIMIT $itemsPerPage
OFFSET ($pageNumber * $itemsPerPage)

当我尝试在 SQL 中动态地将这两个数字相乘时,我在乘法部分收到一个关于我的语法的错误。查询中的数字不能相乘吗?

我的完整查询

SELECT com_id, time_stamp, comBy, post_id, comContent, IFNULL(likes, 0) - IFNULL(dislikes, 0) AS likeResult, profile_pic FROM Comments C
# Adding Likes
LEFT JOIN (SELECT likedCom_id, COUNT(*) AS likes FROM Comment_Likes 
GROUP BY likedCom_id) Cl ON C.com_id=Cl.likedCom_id
LEFT JOIN (SELECT dislikedCom_id, IFNULL(COUNT(*),0) AS dislikes FROM Comment_Dislikes
GROUP BY dislikedCom_id) Cd ON C.com_id=Cd.dislikedCom_id
LEFT JOIN (SELECT user_id, profile_pic FROM Users) U
ON U.user_id = C.comBy
WHERE post_id = '10'
ORDER BY time_stamp DESC
LIMIT 5
OFFSET (0 * 5)

例如上面的OFFSET (0 * 1)代码分别代表pageNumber和itemsPerPage变量。

我在 HeidiSQL 上遇到关于我的查询的错误:

【问题讨论】:

  • 显示您的完整代码 .. 以及您确切的错误信息
  • @scaisEdge 我已经编辑了我的代码。谢谢!
  • 请注意,如果时间戳不是唯一的,您的查询可能无法按预期工作。具有不同偏移值的查询可能会给出不同的查询计划。如果时间戳不是唯一的,则排序将不是完全确定的。为了使其具有确定性,我想您可以更改为“ORDER BY time_stamp DESC, com_id”
  • @oysteing 哇,好收获。谢谢!我还注意到,如果有帖子插入,当用户在应用程序中向下滚动时,分页查询就会出错。所以,我还记录了用户开始向下滚动的时间,并用它来过滤掉之前的插入。我使用“time_stamp
  • 有更有效的分页方法... google "使用 mysql 进行有效分页" ...即保留当前页面最后一行的值,然后在查询中使用这些值下一页

标签: mysql sql node.js


【解决方案1】:

OFFSET 参数是标量值,提供数字文字或单个绑定值。

如果我们需要进行乘法运算,我们可以在客户端中进行,并将结果作为单个参数提供给OFFSET

似乎代码正在动态生成 SQL 语句。我们可以这样做:

$sql =  "SELECT ... OFFSET " . (int)($pageNumber * $itemsPerPage) ;

$offset = $pageNumber * $itemsPerPage ;
$sql =  "SELECT ... OFFSET " . (int)$offset ;

【讨论】:

    【解决方案2】:

    您需要限制并且不能使用计算来通过限制或偏移量(您可以使用动态 SQL)。

    在选择语法中,OFFSET 是 LIMIT 子句中的一个子句(参见 https://dev.mysql.com/doc/refman/8.0/en/select.html#id4651990):

    [LIMIT {[offset,] row_count | row_count OFFSET offset}]

    my_value  = pageNumber * itemsPerPage; 
    
    'SELECT * FROM Posts
    LIMIT 100 OFFSET ' + my_value 
    

    你应该使用order by

    'SELECT * 
    FROM Posts
    ORDER BY your_col
    LIMIT 100 OFFSET ' + my_value 
    

    【讨论】:

    • 是的,我的问题是乘法部分抛出错误。即使我尝试将简单的数字相乘。我已经编辑了我的帖子以包含我的完整查询。
    • 答案已更新..不允许使用计算值..您应该在查询之外执行计算并使用里面的值..最终使用 dinamic sql..
    • 我认为它更具可读性,更容易理解它们是变量。在 Nodejs 中,它们实际上是 connection.escape(decoded.variable) 的形式
    • 是的,这就是我现在所做的。谢谢!
    • .anyway 你对这些参数的计算是不允许的..正如我的回答中所建议的,你需要一个动态查询来计算值(或参数)
    猜你喜欢
    • 2011-02-27
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 2015-01-25
    • 2013-12-20
    相关资源
    最近更新 更多