Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Paginacja literowa
Forum PHP.pl > Forum > PHP
_tomek
Hej,

chcę zrobić paginację literową, wyglądającą mniej więcej tak:
--A--
Adam
Andrzej
--B--
Bartek
Bronek
itd.

Mam zapytanie SQL wyciągające dane i wydzielające pierwszą literę:
  1. SELECT LEFT(platform,1) AS firstletter, id, platform FROM platforms ORDER BY platform
i dwa problemy smile.gif Pierwszy to taki, że w przypadku dwóch i więcej wpisów na tę samą literę, pojawia się tyle samo "pierwszych liter". Chciałbym to zgrupować. Ale grupowanie w zapytaniu odpada - wtedy pobiera tylko jeden wiersz i tyle. Mój drugi problem to uzyskanie pokazanej na początku postu formy. Chciałem to zrobić foreach'em, czyli
  1. foreach($platform as $plat) {
  2. echo $plat->firstletter;
  3. }

ale wtedy nie dość, że problem pierwszy się uwidacznia, to za cholerę nie wiem, jak pobrać z tablicy tylko wpisy odpowiadające danej literze (eee, ktoś to rozumie? tongue.gif). Mój jedyny pomysł to podzapytania, tj puszczenie najpierw w SQL 'GROUP BY firstletter', potem foreach i w tym foreachu jeszcze jedno zapytanie z 'LIKE $letter%'. Ale to wyjdzie tyle zapytań, ile liter, a to chyba nie jest dobre wyjście.

Pomysły?
Crozin
Czy nie wygodniej Ci będzie pogrupować te rekordy już po stronie PHP?

1. Pobierasz posortowane.
2. Każdy z rekordów dopisujesz jako kolejny element wcześniej utworzonej tablicy (gdzie klucze to litery, a wartości to tablica z rekordami).
3. W momencie wyświetlania:
  1. foreach ($list as $letter => $platforms) {
  2. echo $letter;
  3.  
  4. foreach ($platforms as $platform) {
  5. echo $platform->getId();
  6. }
  7. }
lukaskolista
  1. $sql = 'SELECT id, platform FROM platforms GROUP BY platform ORDER BY platform';
  2. $result = mysql_query($sql);
  3. $last_first_letter = '';
  4. while ($row = mysql_fetch_object($result))
  5. {
  6. $first_letter = substr($row->platform, 0, 1);
  7. if ($first_letter !== $last_first_letter)
  8. {
  9. echo 'Nowa literka: '.$first_letter.'<br>';
  10. $last_first_letter = $first_letter;
  11. }
  12. echo $row->platform.'<br>';
  13. }

Pisane w przegladarce wiec sobie sformatuj.

Jak pobrac wpisy odpowiadajace danej literze:
Aby bylo optymalnie proponuje trzymac pierwsza litere w oddzielnej kolumnie (first_letter) i wyszukiwac wlasnie po tej kolumnie. Nie ma sensu za kazdym razem dla kazdego platform wyciagac pierwszej litery.

Jezeli chcesz miec to na prawde profesjonalnie zrobione, to podaj nam troche wiecej informacji o tym co robisz i co juz masz zrobione
ShadowD
Jeśli potrzebujesz listę wszystkich imion to pobieraj całość z sortowaniem po a-z, potem w php $pierwszaLitera='' i pętla jeśli $pierwszaLitera!= pierwszej literze aktualnego słowa to zmieniasz jej wartość na aktualną i wyświetlasz =A= jeśli jest taka sama wyświetlasz imie itd. aż wszystkie imiona się skończą - najprościej i efektywniej, wysyłanie kilk zapytań jest bez sensu, a jeśli chcesz ograniczyć wyniki oddawaj limit lub where i tyle.

Edit:
@Crozin też ma dobry pomysł, dwie pętle, ale nie sprawdzasz za każdym razem pierwszej litery.
_tomek
Dziękuję za tak szybkie odpowiedzi!

Mój problem wziął się stąd, że korzystam (pewnie niedługo "korzystałem") z klasy ezSQL, która w wielu wypadkach tutaj okazała się naprawdę dobrze spełniać swoje zadanie, ale tutaj musiałem zrobić wszystko "ręcznie". Problem był taki, że ezSQL zbiór wyników robi jako tablicę. Ale, w każdym razie, dałem sobie radę i napisałem coś podobnego, jak podał lukaskolista.

Może ktoś wie, jak rozwiązać to przy użyciu ezSQL (dla wygody, żeby nie mieszać, przyjmijmy że mój kod jest taki sam, jak podał lukaskolista)?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.