mysql - 选择包含给定id的分页块

时间:2009-02-23 15:43:16

标签: mysql database

...在确定分页块之前。

我知道你可以在多个陈述中做到这一点,但必须有更好的方法。

我的结果按日期排序,我想返回包含给定id的分页块。例如,我可以选择给定id的日期,然后选择一个结果块,其中date小于或大于日期。那会有用。但是有一些本地mysql方法在一个语句中做这种事情吗?如果结果按日期排序,我们可以要求X结果,其中存在给定的id,这似乎是合理的。

2 个答案:

答案 0 :(得分:0)

我相信这个不能通过一个简单的声明来完成。但是有一个解决方案可以使用存储过程并定义由更多语句组成的自己的函数。

不幸的是,对于SELECT ... LIMIT x,你必须只使用整数,x和y不能是表达式,因此你不能通过分页标准来限制结果。

答案 1 :(得分:0)

SELECT *
FROM
  (
  SELECT @r := COUNT(*),
         @up := @r,
         @down := @r
  FROM items
  WHERE (timestamp, id) < (SELECT timestamp, id FROM items WHERE id = @id)
  ) i,
  (
  SELECT id, timestamp, st, c
  FROM (
    SELECT @down := CASE WHEN (@down % 50) <> 0 THEN @down := @down - 1 ELSE @down END AS c,
           @stop := CASE WHEN (@down % 50) <> 0 THEN 0 ELSE 1 END AS st,
           id, timestamp
    FROM  items
    WHERE (timestamp, id) <= (SELECT timestamp, id FROM items WHERE id = @id)
    ORDER BY
      timestamp DESC, id DESC
    LIMIT 50
    ) down
  UNION ALL
  SELECT id, timestamp, st, c
  FROM (
    SELECT @up := CASE WHEN (@up % 50) <> 0 THEN @up := @up + 1 ELSE @up END AS c,
           @stop := CASE WHEN (@up % 50) <> 0 THEN 0 ELSE 1 END AS st,
           id, timestamp
    FROM  items
    WHERE (timestamp, id) > (SELECT timestamp, id FROM items WHERE id = @id)
    ORDER BY
      timestamp, id
    LIMIT 50
    ) up
  ) r
WHERE NOT st
ORDER BY timestamp, id