Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][mysql]Wyświetlenie rekordów z największą liczbą posortowanych po nazwie
Forum PHP.pl > Forum > Przedszkole
michael_13
Witam mam pewną tabelę zawierającą nazwę oraz liczbę wyświetleń, chciałbym z niej wyświetlić 10 rekordów z największą liczbą wyświetleń posortowanych alfabetycznie po nazwie. Zapytaniem:

  1. SELECT `nazwa`, `wyswietlenia`, `dane`
  2. FROM `tabela` ORDER BY `wyswietlenia`
  3. LIMIT 10

otrzymuję 10 rekordów z największą liczbą wyświetleń, tylko chciałbym żeby te rekordy były już posortowane alfabetycznie po nazwie (a nie po wyświetleniach), w jaki sposób to osiągnąć?

Pozdrawiam smile.gif
Grzyw
Nie wiem, czy to, co napiszę, nie wywali Ci błędu, ale spróbuj tak:
  1. SELECT nazwa, wyswietlenia, dane FROM tabela WHERE id IN (SELECT id FROM tabela ORDER BY wyswietlenia DESC LIMIT 10 ) ORDER BY nazwisko ASC
michael_13
Niestety wywala błąd:

Kod
This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'


Czyli nie można pobrać limitowanej ilości w podzapytaniu:/
Zostaje posortować już w PHP zwrócone rekordy (zależy mi żeby były w jakiejkolwiek innej kolejności tylko nie posortowane po liczbie wyświetleń), jak to zrobić żeby było jak najbardziej optymalne?
Grzyw
  1. SELECT id FROM tabela ORDER BY wyswietlen DESC LIMIT 10


W PHP:

  1. <?php
  2. while ($row = mysql_fetch_object($wynik)
  3. {
  4.  $rekord[$row->id] = $row->wystwietlen;
  5.  
  6. }
  7.  
  8. asort($rekord); # zachowa klucze
  9.  
  10. foreach ($rekord as $id => $wyswietlen)
  11. {
  12. # Tutaj pobierz dane z jednego rekordu "SELECT * FROM tabela WHERE id = $id
  13. # I wyświetl dowolne dane
  14. }
  15. ?>
michael_13
Tylko jest problem bo z bazy wyciągam więcej niż 2 kolumny, czyli zastosowanie zwykłej tablicy odpada, trzeba tablicę asocjacyjna, czyli:
  1. <?
  2. $dane['1']['nazwa']='Nazwa1';
  3. $dane['1']['dane']='Dane1';
  4. $dane['2']['nazwa']='Nazwa2';
  5. $dane['2']['dane']='Dane2';
  6. $dane['3']['nazwa']='Nazwa3';
  7. $dane['3']['dane']='Dane3';
  8. //.
  9. //.
  10. //.
  11. //do tablicy asocjacyjnej zapisaliśmy tak:
  12. while ($row = mysql_fetch_assoc($result))
  13. {
  14. $dane[$row['id']]['nazwa']=$row['nazwa'];
  15. $dane[$row['id']]['dane']=$row['dane'];
  16. }
  17. ?>

I jak to posortować po nazwie?

Coś mi się zdaje, że w złą stronę idę bo zbyt skomplikowane rozwiązanie się robi z tego (i kolejne dodatkowe pętle itd) :/ hmm musi być jakieś proste rozwiązanie tongue.gif

EDIT
A może zrobić to 2 zapytaniami, w pierwszym zapytaniu pobrać same ID dla pozycji z największą liczbą wyświetleń a potem kolejne zapytanie z które wyświetli posortowane po nazwie rekordy o ID z pierwszego zapytania?
Grzyw
Dlatego podałem Ci przykład, żeby nie robić dwuwymiarowej tablicy.
Ale skoro taką już masz, to:

http://pl2.php.net/function.array-multisort

Tak na dobrą sprawę, wyciągnięcie danych wielowymiarowych i skorzystanie z funkcji array_multisort() to rozwiązanie najbardziej optymalne.
michael_13
Wiec ogólne rozwiązanie to:

zapytanie:
  1. SELECT `id`, `nazwa`, `wyswietlenia`
  2. FROM `tabela` ORDER BY `wyswietlenia` DESC LIMIT 10


w PHP sortujemy po nazwie:
  1. <?php
  2. //$result - wynik zwrócony z zapytania
  3.  
  4. $counter = 0;//podstawowy indeks dla tablicy wielowymiarowej, dlaczego nie zastosować automatyc
    znego indeksa: $dane[] niech każdy sam sprawdzi
  5. while ($row = mysql_fetch_assoc($result))
  6. {
  7. $dane[$counter]['nazwa']=$row['nazwa'];
  8. $dane[$counter]['wyswietlenia']=$row['wyswietlenia'];
  9.  
  10. $nazwa[$counter]=$row['nazwa'];
  11. $wyswietlenia[$counter]=$row['wyswietlenia'];
  12. $id[$counter++]=$row['id'];
  13. }
  14. //mamy 4 tablice:
  15. //$dane - wielowymiarowa zawiera wszystkie dane, ją będziemy sortować według 3 pozostałyc
    h tablic
  16.  
  17. $nazwa = array_map('strtolower', $nazwa);//wielkość liter przy sortowaniu ma znaczenie więc wszystko z małych
  18.  
  19. array_multisort($nazwa, SORT_ASC, $wyswietlenia, $id, $dane);
  20.  
  21. //osiągnięty cel, gotowa posortowana tablica:
  22. print_r ($dane);
  23.  
  24. ?>


Cytat
Tak na dobrą sprawę, wyciągnięcie danych wielowymiarowych i skorzystanie z funkcji array_multisort() to rozwiązanie najbardziej optymalne.


Mam nadzieję, że masz racje, nie mam już czasu sprawdzać sposobu z dwoma zapytaniami (niby taki banał posortować a zajął mi tyle czasu..) więc zostanę przy takim sortowaniu.

Pozdrawiam.
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.