2013-12-12 2 views
1

Я новичок в sql, поэтому мне нужна ваша помощь! Мне нужна хранимая процедура, чтобы получить определенное количество статей с некоторым смещением и общее количество их, чтобы сделать разбиение на страницы ... - это правильный код или есть лучший способ? Сколько запросов будет выполнено, 1 для ctid, 1 для всего и 1 для данных контента?Сохраненная процедура для получения некоторых строк и всего

DELIMITER $$ 
CREATE PROCEDURE `getArticles`(`offset` INT, `count` INT) 
BEGIN 
    DECLARE ctid, total INT; 
    SET ctid = (SELECT id FROM content_types WHERE name='article'); 
    SET total = (SELECT COUNT(*) FROM content WHERE content_type = ctid); 
    SELECT *, total FROM content 
    WHERE content_type = ctid 
    LIMIT count 
    OFFSET offset; 
END $$ 
DELIMITER ; 

ответ

2

Вы можете попробовать использовать SQL_CALC_FOUND_ROWS вариант и FOUND_ROWS() функции

SQL_CALC_FOUND_ROWS и FOUND_ROWS() могут быть полезны в ситуациях, когда вы хотите ограничить количество строк, возвращаемых запросом, но и определите количество строк в полном наборе результатов без выполнения запроса . Примером может служить веб-скрипт, на котором отображается выложенный экран , содержащий ссылки на страницы, отображающие другие разделы результата поиска . Используя FOUND_ROWS(), вы можете определить, сколько еще других страниц потребуется для остальной части результата.

Это сказанное ваша процедура может выглядеть использование

DELIMITER $$ 
CREATE PROCEDURE get_articles(IN _offset INT, IN _count INT, OUT _total INT) 
BEGIN 
    SELECT SQL_CALC_FOUND_ROWS * 
    FROM content c JOIN content_types t 
     ON c.content_type = t.id 
    WHERE t.name = 'article' 
    LIMIT _offset, _count; 
    SET _total = FOUND_ROWS(); 
END$$ 
DELIMITER ; 

Образец:

SET @total = 0; 
CALL get_articles(0, 3, @total); 
SELECT @total; 

Вот SQLFiddle демо

+0

thx для такого подробного ответа, но мне не нужно количество строк, возвращаемых запросом. Мне нужны данные таблицы контента с лимитом возвращаемых строк и общим количеством всех строк. – Kirill

+1

Вы не понимаете. 'FOUND_ROWS()' когда включен 'SQL_CALC_FOUND_ROWS' возвращает ** точно ** то, что вы задали, - общее количество строк ** ALL **, как если бы' LIMIT' не применялся к запросу, и он быстрее выдавал другой запрос даже завернутый в подзапрос. Взгляните на рабочий пример. – peterm

+0

извините, не читал до конца ... Но мне все еще нужно сделать дополнительный запрос, чтобы получить @total, правильно ли я понял? – Kirill

0

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

SELECT c.*, 
     (SELECT COUNT(*) FROM content AS c1 WHERE c1.content_type = ct.id) AS total 
    FROM content AS c 
    INNER JOIN content_type AS ct ON c.content_type = ct.id 
WHERE ct.name = 'article' 
    LIMIT offset, count; 
+0

правда было легче, спасибо! – Kirill

Смежные вопросы