Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php][mysql]Wyświetlenie rekordów z największą liczbą posortowanych po nazwie
michael_13
post 24.03.2008, 11:47:16
Post #1





Grupa: Zarejestrowani
Postów: 13
Pomógł: 1
Dołączył: 13.05.2007

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


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


--------------------
<?php
die ('Wiedza sama w sobie nie ma żadnej wartości. Cenną czyni ją jej STOSOWANIE. Innymi słowy, świat nie odpłaca Ci za to, co wiesz. Świat odpłaca Ci za to, co robisz.');
?>
Go to the top of the page
+Quote Post
Grzyw
post 24.03.2008, 11:50:56
Post #2





Grupa: Zarejestrowani
Postów: 561
Pomógł: 75
Dołączył: 19.08.2004
Skąd: Wrocław

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


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


Ten post edytował Grzyw 24.03.2008, 11:51:50


--------------------
Idąc po czyichś śladach, nie zajdziesz ani kroku dalej...
Go to the top of the page
+Quote Post
michael_13
post 24.03.2008, 12:10:09
Post #3





Grupa: Zarejestrowani
Postów: 13
Pomógł: 1
Dołączył: 13.05.2007

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


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?

Ten post edytował michael_13 24.03.2008, 12:12:26


--------------------
<?php
die ('Wiedza sama w sobie nie ma żadnej wartości. Cenną czyni ją jej STOSOWANIE. Innymi słowy, świat nie odpłaca Ci za to, co wiesz. Świat odpłaca Ci za to, co robisz.');
?>
Go to the top of the page
+Quote Post
Grzyw
post 24.03.2008, 12:15:55
Post #4





Grupa: Zarejestrowani
Postów: 561
Pomógł: 75
Dołączył: 19.08.2004
Skąd: Wrocław

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


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


Ten post edytował Grzyw 24.03.2008, 12:17:43


--------------------
Idąc po czyichś śladach, nie zajdziesz ani kroku dalej...
Go to the top of the page
+Quote Post
michael_13
post 24.03.2008, 12:39:58
Post #5





Grupa: Zarejestrowani
Postów: 13
Pomógł: 1
Dołączył: 13.05.2007

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


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?

Ten post edytował michael_13 24.03.2008, 12:43:50


--------------------
<?php
die ('Wiedza sama w sobie nie ma żadnej wartości. Cenną czyni ją jej STOSOWANIE. Innymi słowy, świat nie odpłaca Ci za to, co wiesz. Świat odpłaca Ci za to, co robisz.');
?>
Go to the top of the page
+Quote Post
Grzyw
post 24.03.2008, 12:43:43
Post #6





Grupa: Zarejestrowani
Postów: 561
Pomógł: 75
Dołączył: 19.08.2004
Skąd: Wrocław

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


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.

Ten post edytował Grzyw 24.03.2008, 12:45:05


--------------------
Idąc po czyichś śladach, nie zajdziesz ani kroku dalej...
Go to the top of the page
+Quote Post
michael_13
post 24.03.2008, 13:33:27
Post #7





Grupa: Zarejestrowani
Postów: 13
Pomógł: 1
Dołączył: 13.05.2007

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


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.

Ten post edytował michael_13 24.03.2008, 13:48:21


--------------------
<?php
die ('Wiedza sama w sobie nie ma żadnej wartości. Cenną czyni ją jej STOSOWANIE. Innymi słowy, świat nie odpłaca Ci za to, co wiesz. Świat odpłaca Ci za to, co robisz.');
?>
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: 19.07.2025 - 12:45