Автор Тема: Помощ за mysql заявка при страниране на резултати  (Прочетена 1508 пъти)

Naka

  • Напреднали
  • *****
  • Публикации: 3467
    • Профил
При страниране на резултати за веб, << 1,2,3..>> имам такова заявка:

$sql="SELECT id FROM $my_table USE INDEX (category)
WHERE category='$category'
LIMIT $offset, $per_page";

където:
$page=1,2,3,4... и т.н.
$offset = (($page * $per_page) - $per_page);

Данни те са групирани в 'category' като в категорията са уникални продукти всяко със собствено 'id' и се извеждат по страници.
това е тривиална задача, работи си от много време, с нея нямам проблеми.

Но ми трябва и обратно решение, и не мога да се сетя какво трябва да куeрито. Ако имам само 'id'-то, как мога да оределя в коя страница се намира?

Например да извърти всички резултати в категорията, подредени по същия начин както в оригиналната заявка, но да се спре когато се стигне до търсенето 'id'. Тогава според броя върнати резултати (като ги разделя на $per_page), ще мога да определя и точната страница в която се намира въпросното 'id'?
« Последна редакция: Dec 01, 2009, 12:21 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

neter

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 3408
  • Distribution: Debian, SailfishOS, CentOS
  • Window Manager: LXDE, Lipstick
    • Профил
    • WWW
Не съм сигурен дали това е оптималният вариант, но това ми хрумна като работещо решение
Код
GeSHi (SQL):
  1. SET @rownum := 0;
  2. SELECT * FROM (SELECT @rownum := @rownum + 1 AS row, id FROM $my_table USE INDEX (category) WHERE category = '$category') AS t1 WHERE id = '$id_variable'
Заявката избира всички редове от таблицата, които отговарят на зададената променлива $category, номерира редовете в изведената заявка, и след това от този резултат се избира редът с нужното id. В колоната row на крайния резултат ще се съдържа число, което можеш да разделиш на $per_page, да закръглиш към горната или долната стойност (както ти е по-удобно за твоя код), и ще получиш номера на страницата, в която би се намирал този ред ;)

P.S.0: Това, че не използваш ORDER BY, може да доведе до неочаквани резултати при някои SELECT-и. Препоръчвам ти да го използваш (ти прецени за коя колона; може и да е различна в различните части на сайта, но трябва да е еднаква за зависещите една от друга заявки), за да си винаги наясно кое къде застава.

P.S.1: Ако ще вписваш съответстващите страници за няколко id-та (например, списък от новини), не е хубаво да правиш цялата заявка за всеки отделен ред. Използвай само вътрешната част на заявката
Код
GeSHi (SQL):
  1. SET @rownum := 0;
  2. SELECT @rownum := @rownum + 1 AS row, id FROM $my_table USE INDEX (category) WHERE category = '$category'
и използвай стойностите от получения масив, за да пресмяташ съответстващата страница за всеки ред.
« Последна редакция: Dec 01, 2009, 15:24 от neter »
Активен

"Да си добре приспособен към болно общество не е признак за добро здраве" - Джиду Кришнамурти

Naka

  • Напреднали
  • *****
  • Публикации: 3467
    • Профил
Мерси, ориентирах се. Мислех, че може да има по-просто и бързо решение и че нещо не доглеждам, но явно това е.

Цитат
Това, че не използваш ORDER BY, може да доведе до неочаквани резултати при някои SELECT-и.
ORDER BY имам в заявката, както и разни други дреболии, но я опростих заради примера.

Освен това имам и в таблицата и колона с номерата на редовете-rownum. ;D Но тази колона не винаги е нормализирана не винаги се подържа в поредност на редеовете. Затова и търсих по просто решение.

Ще трябва да си оправя подреждането на rownum колоната, и тогава всичко става много просто за изобразяване: както и странинирането, така и обратната задача за намиране на страницата по зададено id.










« Последна редакция: Dec 07, 2009, 12:00 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
DBI::MySql
Настройка на програми
maniac 6 3826 Последна публикация Apr 26, 2004, 19:38
от maniac
PHP -> C/C++ -> PHP -> MySQL
Общ форум
Йордан 9 3030 Последна публикация Jun 01, 2004, 21:21
от Mecho_Puh
Perl + CGI,DBI + Mysql ili PHP + Mysql
Общ форум
jica 3 8700 Последна публикация Sep 07, 2004, 17:02
от jica
Mysql проблем със стартирането(mysql.sock missing)
Настройка на програми
coveka 6 11003 Последна публикация Mar 01, 2008, 22:02
от coveka
Mysql: can't connect to local mysql server
Настройка на програми
wonder 1 9605 Последна публикация Mar 16, 2008, 01:17
от neter