2011-09-27 60 views
2

我用下面的MySQL查询创建一个分页阵列从一个MySQL子查询返回的最后一行 - 用于文档的列表 - 形式“的Ab-CF | CG乐| 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 

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

回答

0

请尝试添加

OR [email protected]

到您的WHERE子句(在我的测试情况下,这个工程)

+0

这将与子查询工作,因为它是在的问题,但就像我说的,这是一个非常简化的子查询。子查询根据情况而有所不同,所以尽管您的答案在给出的示例中有效,但其他时间将无法使用。我需要的是子查询返回的行数,而不是表中包含的行数。 – intelligentdesigner

+0

然后这将是一个真正的好主意,发布您的完整声明 – rabudde

+0

完成 - 这是一个实际的例子。结果数将与子查询的变化,但它永远是子查询的行数,我很感兴趣的 – intelligentdesigner