...在分页块已被确定之前。mysql - 选择包含给定标识的分页块
我知道你可以在多条语句中做到这一点,但必须有更好的方法。
我的结果按日期排序,我想返回包含给定ID的分页块。因此,例如,我可以选择给定ID的日期,然后选择日期小于或大于日期的结果块。这将工作。但有一种本地mysql方法在一个语句中做这种事情?如果结果是按日期排序的,我们可以期望我们可以要求X结果中存在给定的id。
...在分页块已被确定之前。mysql - 选择包含给定标识的分页块
我知道你可以在多条语句中做到这一点,但必须有更好的方法。
我的结果按日期排序,我想返回包含给定ID的分页块。因此,例如,我可以选择给定ID的日期,然后选择日期小于或大于日期的结果块。这将工作。但有一种本地mysql方法在一个语句中做这种事情?如果结果是按日期排序的,我们可以期望我们可以要求X结果中存在给定的id。
我相信这个不能用来做一个简单的陈述。但有一个解决方案可以使用存储过程并定义由更多语句组成的自己的函数。
不幸的是,对于SELECT ... LIMIT x,y您只能使用整数,x和y不能是表达式,因此您无法通过分页标准限制结果。
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