Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Paginacja literowa
_tomek
post 2.06.2012, 18:57:13
Post #1





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 31.05.2012

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Crozin
post 2.06.2012, 19:03:52
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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. }
Go to the top of the page
+Quote Post
lukaskolista
post 2.06.2012, 19:05:13
Post #3





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

Ostrzeżenie: (0%)
-----


  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

Ten post edytował lukaskolista 2.06.2012, 19:14:09
Go to the top of the page
+Quote Post
ShadowD
post 2.06.2012, 19:05:32
Post #4





Grupa: Zarejestrowani
Postów: 1 333
Pomógł: 137
Dołączył: 25.03.2008
Skąd: jesteś??

Ostrzeżenie: (0%)
-----


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.

Ten post edytował ShadowD 2.06.2012, 19:06:47


--------------------
Mój blog - o wszystkim i niczym ale zazwyczaj związane z informatyką! ;-)
Githube

Usługi spawalnicze i monterskie | Park linowy Lublin i Okunince
Go to the top of the page
+Quote Post
_tomek
post 2.06.2012, 19:37:27
Post #5





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 31.05.2012

Ostrzeżenie: (0%)
-----


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)?
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 16.07.2025 - 02:51