我正在使用以下mysql查询创建一个分页数组 - 用于文档列表 - 格式为“Ab-Cf | Cg-Le | Li-Ru”等...
子查询'Subquery'选择整个文档列表,并且根据用户权限,要求等而变化 - 所以我试图避免改变查询的那一部分(并且在这里使用了简化版本)
然后我选择每个页面范围的第一行和最后一行 - 即第1行和第10行,第11行和第20行等,由$ num_rows_per_page确定。
SELECT * FROM
(
SELECT @row := @row + 1 AS `rownum`, `sort_field` FROM
(
SELECT @row := 0 ) r, (
SELECT D.`id`, D.`display_name` as display_field,
D.`sort_name` as sort_field
FROM Document D ORDER BY `sort_field` ASC
) Subquery
) Sorted
WHERE rownum % $num_rows_per_page = 1 OR rownum % $num_rows_per_page = 0
这工作正常,给我一个结果集如:
+---------+-----------------------------------+
| rownum | index_field |
+---------+-----------------------------------+
| 1 | Alternaria humicola |
| 10 | Anoplophora chinensis |
| 11 | Atherigona soccata |
| 20 | Carlavirus RCVMV |
| 21 | Cephus pygmaeus |
| 30 | Colletotrichum truncatum |
| 31 | Fusarium oxysporium f. sp. ciceri |
| 40 | Homalodisca vitripennis |
| 41 | Hordevirus BSMV |
| 50 | Mayetiola hordei |
| 51 | Meromyza saltatrix |
| 60 | Phyllophaga |
| 61 | Pyrenophora teres |
+--------+------------------------------------+
然而 - 在我的生活中,我不能弄清楚如何在结果集中包含子查询的最后一行行。即,rownum 67(或其他)的行不符合WHERE子句的标准。
我希望以某种方式提取rownum
的最大值并将其添加到WHERE子句中,但我没有任何乐趣。
有什么想法吗?
如果不清楚,请尽快重新措辞!
编辑 - 这是一个更合适的子查询版本:
SELECT * FROM
(
SELECT @row := @row + 1 AS `rownum`, `sort_field` FROM
(
SELECT @row := 0 ) r,
(
SELECT D.`id`, D.`display_name` as display_field,
D.`sort_name` as sort_field
FROM Document D INNER JOIN
(
SELECT DS.* FROM Document_Status DS INNER JOIN
(
SELECT `document_id`, max(`datetime`) as `MaxDateTime`
FROM Document_Status GROUP BY `document_id`
)
GS ON DS.`document_id` = GS.`document_id`
AND DS.`datetime` = GS.`MaxDateTime`
AND DS.`status` = 'approved' INNER JOIN
(
SELECT `id` FROM Document WHERE `template_id`= 2 ) GD
ON DS.`document_id` = GD.`id`
)
AG ON D.id = AG.document_id ORDER BY `sort_field` ASC
) Subquery
) Sorted
WHERE rownum % $num_rows_per_page = 1 OR rownum % $num_rows_per_page = 0
但是,要记住的一个关键点是子查询将根据上下文而改变。
答案 0 :(得分:0)
请尝试添加
OR rownum=@row
到您的WHERE子句(在我的测试用例中这是有效的)