SQL Count общее количество строк при использовании LIMIT

Я пытаюсь создать простую галерею изображений, отображающую 16 изображений на странице. Я использую LIMIT 16 для отображения правильной суммы на странице, но если есть более 16 строк, я хочу иметь ссылки внизу, позволяя пользователю перейти на следующую страницу.

Я знаю, что мог бы достичь желаемого результата, удалив ограничение и просто используя цикл для отображения первых 16 элементов, но это было бы неэффективно. Очевидно, что COUNTING количество строк всегда равно 16.

$sql .= "posts p, images im, postimages pi WHERE
    i.active = 1 
    AND pi.post_id = p.id
    AND pi.image_id = im.image_id 
    ORDER BY created_at LIMIT 16";

Может ли кто-нибудь предложить более эффективный способ сделать это?

Спасибо

Ответы

Ответ 1

Вам нужно компенсировать результаты для данной страницы, в которой вы находитесь, в дополнение к отдельному запросу для получения счета, о котором говорили все остальные.

$sql .= "posts p, images im, postimages pi WHERE
    i.active = 1 
    AND pi.post_id = p.id
    AND pi.image_id = im.image_id 
    ORDER BY created_at 
    LIMIT ". ($page - 1) * $pagesize .", ". $pagesize;

Здесь будут применяться обычные предупреждения об инъекции SQL.

Ответ 2

В MySQL:

SELECT  SQL_CALC_FOUND_ROWS
        *
FROM    posts p, images im, postimages pi
WHERE   i.active = 1 
        AND pi.post_id = p.id
        AND pi.image_id = im.image_id 
ORDER BY
        created_at
LIMIT 16;

SELECT  FOUND_ROWS();

Первый запрос вернет строки 16, а второй запрос вернет вам число строк, которые будут возвращены, там нет предложения LIMIT в первом запросе.

Вы можете использовать его, чтобы решить, показывать ли "следующую" ссылку или нет.

Ответ 3

Вы пытаетесь полностью разбиться на страницы или просто имеете this page и next page? Если это последний, вы можете просто LIMIT 17 и подсчитать строки результата. Если вам 17, вам нужно разбивать на страницы.

Ответ 4

Запустите отдельный запрос без ограничения, который возвращает только счет.

Ответ 5

используйте два запроса, где один из них - ваш запрос, а другой:

SELECT COUNT(primary_key) FROM ... WHERE...