在对结果集进行分页时,从mysql子查询返回最后一行

时间:2011-09-27 02:01:35

标签: mysql sql database

我正在使用以下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

但是,要记住的一个关键点是子查询将根据上下文而改变。

1 个答案:

答案 0 :(得分:0)

请尝试添加

OR rownum=@row

到您的WHERE子句(在我的测试用例中这是有效的)