1

Mysql:我需要在查询中获取项目的偏移量。

我有一个图像库:每个堆栈显示 6 个图像,所以当我请求图像 22 时,它会显示从 18 到 24 的图像。它应该首先获取图像 22 的偏移量,然后获取从 18 到 24 的图像。

另一个例子:我请求图像编号 62(和偏移量 62),它将选择偏移量从 60 到 66 的图像。

单个查询可以吗?

主要重要的是获取其 id 等于数字的项目的偏移值。

谢谢 ;)

编辑: select * from images order_by updated_at offset(这里我需要在此查询中获取图像 id 的偏移量,并进行一些计算......这就是我需要的,如果可能的话......:d)

EDIT2: 现在我知道我需要 2 个查询:

1º:使用我的自定义订单获取查询中图像的偏移量

2º:使用第一个查询的偏移量获取图像......这个我可以单独完成,第一个是问题......:s

4

4 回答 4

3

如果您的图像具有顺序 ID,您可能需要执行以下操作:

SELECT    * 
FROM      images 
WHERE     id >= ((? DIV 6) * 6) AND 
          id < (((? DIV 6) + 1) * 6)
ORDER BY  id;

将上述查询中的参数替换为?请求的图像的 ID。


更新:您的图像似乎不是按顺序 ID 排序的,而是按时间戳排序的。不幸的是,MySQL 似乎不支持LIMIT子句(Source)中的变量表达式。一种选择是使用准备好的语句:

PREPARE stmt FROM 
" SELECT    * 
  FROM      images
  ORDER BY  updated_at
  LIMIT     ?, 6";

SET @lower_limit := ((22 DIV 6) * 6);

EXECUTE stmt USING @lower_limit;

另一种选择可能是:

SET @row = 0;

SELECT    * 
FROM      images 
WHERE     (@row := @row + 1) BETWEEN ((3 DIV 6) * 6) + 1 and (((3 DIV 6) + 1) * 6)
ORDER BY  updated_at;
于 2010-04-02T12:35:51.390 回答
1

编辑:似乎 MySQL 不允许在 OFFSET 子句中使用这种表达式。如果您可以使用准备好的语句(直接用 SQL 或其他语言),您可以预先进行计算并使用它。请参阅Daniel的回答。由于其他有用的信息,我将这个答案留在这里。

您正在寻找的内容称为分页。在 MySQL 中,您可以使用LIMITandOFFSET关键字来执行此操作:

SELECT   image
FROM     images
ORDER BY updated_at
LIMIT    6
OFFSET   (DIV(?, 6) * 6)

替换?为请求的图像索引。请注意,当您要求图像 62 时,这将给出偏移量为 60、61、62、63、64、65 的图像。我假设您在示例中给出的最后一个偏移量是独占的。如果我做出错误的假设,你应该相应地调整。

还有一点解释:

LIMIT使查询仅返回给定数量的结果。因为你总是想要六个,这很容易。

OFFSET使查询仅返回给定偏移量的结果。该计算将整数除以六并乘以六。这会导致给定数字的前六的倍数,​​这正是您想要的。

于 2010-04-02T12:49:50.940 回答
1

我可能不明白你,但为什么你必须在 MySQL 中做所有事情?

假设您使用 LAMP:

$pagination_start = (int)(floor($id_requested / 6)*6);
$offset_array = ($id_requested % 6);
$offset_mysql = $pagination_start + $offset_array;

现在您已经开始在$pagination_start[ie 60] 中进行分页,并在以下位置请求图像偏移 [ie 62] $offset_mysql

SELECT   image
FROM     images
ORDER BY updated_at DESC
LIMIT    $pagination_start, 6

现在作为回报,您会得到一个包含 6 张图像的数组,而请求的图像位于$result[$offset_array].

于 2010-04-02T13:34:39.353 回答
0
SELECT   image
FROM     images
ORDER BY updated_at
LIMIT    6, FLOOR($number / 6 ) * 6;
于 2010-04-02T13:34:33.563 回答