Linux за българи: Форуми

Програмиране => Web development => Темата е започната от: Naka в Dec 01, 2009, 12:10



Титла: Помощ за mysql заявка при страниране на резултати
Публикувано от: Naka в Dec 01, 2009, 12:10
При страниране на резултати за веб, << 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'?


Титла: Re: Помощ за mysql заявка при страниране на резултати
Публикувано от: neter в Dec 01, 2009, 13:16
Не съм сигурен дали това е оптималният вариант, но това ми хрумна като работещо решение
Код
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'
и използвай стойностите от получения масив, за да пресмяташ съответстващата страница за всеки ред.


Титла: Re: Помощ за mysql заявка при страниране на резултати
Публикувано от: Naka в Dec 07, 2009, 11:56
Мерси, ориентирах се. Мислех, че може да има по-просто и бързо решение и че нещо не доглеждам, но явно това е.

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

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

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