SQL Count общее количество строк при использовании LIMIT - PullRequest
13 голосов
/ 14 июля 2009

Я пытаюсь создать простую галерею изображений, показывающую 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";

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

Спасибо

Ответы [ 5 ]

28 голосов
/ 14 июля 2009

В 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 голосов
/ 14 июля 2009

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

3 голосов
/ 14 июля 2009

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

1 голос
/ 14 июля 2009

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

$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.

0 голосов
/ 14 июля 2009

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

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