2009-02-23 29 views
0

...在分页块已被确定之前。mysql - 选择包含给定标识的分页块

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

我的结果按日期排序,我想返回包含给定ID的分页块。因此,例如,我可以选择给定ID的日期,然后选择日期小于或大于日期的结果块。这将工作。但有一种本地mysql方法在一个语句中做这种事情?如果结果是按日期排序的,我们可以期望我们可以要求X结果中存在给定的id。

回答

0

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

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

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