【问题标题】:Returning the last row from a mysql subquery when paginating a result set对结果集进行分页时从 mysql 子查询返回最后一行
【发布时间】: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

但是,要记住的关键点是子查询会根据上下文而变化。

【问题讨论】:

    标签: mysql sql database


    【解决方案1】:

    请尝试添加

    OR rownum=@row

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

    【讨论】:

    • 这将与问题中的子查询一起使用,但就像我说的,这是一个非常简化的子查询。子查询会根据情况而变化,因此虽然您的答案将在给出的示例中起作用,但在其他任何时候都不会起作用。我需要的是子查询返回的行数,而不是表中包含的行数。
    • 那么发布您的完整声明将是一个非常好的主意
    • 完成——这是一个实际的例子。结果的数量会随子查询而变化,但我感兴趣的始终是该子查询的行数。
    • 那个一炮打响!谢谢!现在很简单,你已经为我拼出来了。
    猜你喜欢
    • 1970-01-01
    • 2017-05-12
    • 2012-07-28
    • 1970-01-01
    • 2018-03-06
    • 2018-02-25
    • 1970-01-01
    • 2014-11-08
    • 2012-12-21
    相关资源
    最近更新 更多