?

Log in

No account? Create an account
Main

Винегрет -- пагинация, youtube, фильм The Insider (Свой человек)

Вот ведь какая штука, казалось бы простая фенечка -- добавить разбивку по страницам к выводу результатов запроса. Но до Mysql 5-й версии, где появился SQL_CALC_FOUND_ROWS, для того, чтобы узнать полное количество записей, в добавок к запросу с LIMIT, нужен был еще один -- запрос-счетчик, возвращающий число всех записей. А лишний запрос, это штука, которую веб-программисты не любят и избегают. Хотел прославить MySQL, дав ссылку на этот замечательный флаг в документации, но сайт mysql.com молчит как партизан уже 3-й день, поэтому процитирую:

SQL_CALC_FOUND_ROWS tells MySQL to calculate how many rows there would be in the result set, disregarding any LIMIT clause. The number of rows can then be retrieved with
SELECT FOUND_ROWS()


Однако, кроме этой понятной заморочки, некоторые программеры любят допустить весьма популярную ошибку -- посчитать число страниц, как результат целочисленного деления числа записей, на число записей на страницу плюс один (floor(rows/pagesize)+1).

При этом забывают, что в том случае, когда эти параметры делятся без остатка, добавлять единицу не надо (если у нас 10 записей на страницу, и всего записей 20, то страниц все же 2, а не 3). Правильный результат будет и просто при округлении вверх.

Вы думаете, я сейчас про Васю Пупкина? Нет, я про Йутуб


Приведенный по ссылке клип из фильма The Insider (Свой Человек) про судебный процесс против табачных компаний. Рассказывает о свободе слова. Журналист Lowell Bergman (его играет Аль Пачино), нашел Джеффри Вайганда (его играет Рассел Кроу), уволенного вице-президента компании Браун и Вильямсон, и убедил дать его показания в суде и в передаче 60 минут о добавляемых в табак веществах. Против Вайганда разразилась настоящая травля. У богатых табачных компаний длинные руки. И руководство CBS решило убить этот сюжет. В этом ролике Пачино говорит такую речь (на 2:45):

LOWELL
... You pay me to go get guys like
Wigand, to draw him out. To get him to
trust us, to get him to go on television.
I do. I deliver him. He sits. He
talks. He violates his own fucking
confidentiality agreement. And he's only
the key witness in the biggest public
health reform issue, maybe the biggest,
most-expensive corporate-malfeasance case
in U.S. history. And Jeffrey Wigand,
who's out on a limb, does he go on
television and tell the truth? Yes.
Is it newsworthy? Yes. Are we gonna air
it? Of course not. Why? Because he's
not telling the truth? No. Because he
is telling the truth. That's why we're
not going to air it. And the more truth
he tells, the worse it gets!

Сценарий


UPD
Кстати, умные парни, говорят, что если индексы правильные, то два запроса быстрее, чем один с этой опцией:

http://www.mysqlperformanceblog.com/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/

Comments

вообще-то sql_calc_found_rows появилось не в 5-ой версии, а вроде бы в 4.0
По крайней мере в 4.1 это точно есть
Кстати, умные парни, говорят, что если индексы правильные, то два запроса быстрее, чем один с этой опцией:

http://www.mysqlperformanceblog.com/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/
я думаю, это скорее баг, чем фича. Должны подправить в конце концов. А пока что можно использовать только с оглядкой. Где-то быстрее, где-то медленнее
floor((rows + pagesize - 1)/pagesize) - это наше все :-)

Edited at 2008-02-13 04:10 pm (UTC)
floor((rows + pagesize - 1)/pagesize)=
floor((rows - 1)/pagesize + 1)=
floor((rows - 1)/pagesize) + 1

ceil(rows/pagesize) лаконичнее.