【发布时间】:2011-09-28 18:09:55
【问题描述】:
我正在使用以下 mysql 查询来创建一个分页数组——用于文档列表——格式为“Ab-Cf | Cg-Le | Li-Ru”等...
子查询“子查询”选择整个文档列表,并且根据用户权限、要求等而变化——因此我试图避免更改查询的那一部分(并在此处使用了简化版本) .
然后我选择每个页面范围的第一行和最后一行——即第 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
但是,要记住的关键点是子查询会根据上下文而变化。
【问题讨论】: