开发者

Returning the last row from a mysql subquery when paginating a result set

I'm using the following mysql query to create a pagination array -- for a list of documents -- in the form "Ab-Cf | Cg-Le | Li-Ru " etc...

The subquery 'Subquery' selects the entire list of documents, and is variable depending on the user privileges, requirements etc -- so I'm trying to avoid altering that part of the query (and have used a simplified version here).

I'm then selecting the first and last row of each page range -- i.e, the 1st and 10th row, the 11th and 20th row etc., determined by $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 ro开发者_Python百科wnum % $num_rows_per_page = 1 OR rownum % $num_rows_per_page = 0

This is working just fine, and gives me a result set like:

+---------+-----------------------------------+
| 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                 | 
+--------+------------------------------------+

However -- I can't for the life of me work out how to include the last row of the subquery in the result set. I.e., the row with rownum 67 (or whatever) that does not meet the criteria of the WHERE clause.

I was hoping to somehow pull the maximum value of rownum and add it to the WHERE clause, but I'm having no joy.

Any ideas?

Happy to try to rephrase if this isn't clear!

Edit -- here's a more appropriate version of the subquery:

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

But, a key point to remember is that the subquery will change depending on the context.


Please try adding

OR rownum=@row

to your WHERE clause (in my testing case this works)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜