Я использую следующий запрос 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
Но необходимо помнить, что подзапрос будет меняться в зависимости от контекста.