Возврат последней строки из подзапроса mysql при разбивке на страницы набора результатов - PullRequest
2 голосов
/ 27 сентября 2011

Я использую следующий запрос 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

Но необходимо помнить, что подзапрос будет меняться в зависимости от контекста.

1 Ответ

0 голосов
/ 27 сентября 2011

Пожалуйста, попробуйте добавить

OR rownum=@row

к вашему предложению WHERE (в моем тестовом случае это работает)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...