Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: problem z zapytaniem mysql (sortowanie przed grupowaniem)
Forum PHP.pl > Forum > Bazy danych > MySQL
jymbox
mam problem z zapytaniem :/ wiem ze jest bardzo duzo podobnych tematow i probowalem z nich cos wyciagnac ale niestety nie umiem i w ostatecznosci zwracam sie do Was... a mianowicie mam takie zapytanie:

  1. $wynik = mysql_query("SELECT 'idzaw', 'nazwisko', 'imie', 'skrotkl' (SELECT 'sinclair' FROM 'wyniki' ORDER BY 'sinclair' DESC LIMIT 10 ) FROM wyniki WHERE (rok) = '2011' AND (plec) = 'm' GROUP BY idzaw ")
  2. OR die('Błąd zapytania');


ogolnie chodzi mi o to zeby sortowanie bylo przed grupowaniem ale niestety w tym moim zapytaniu to nie dziala baaasmiley.gif nic nie dziala wywala blad zapytania... prosze o pomoc naprawde glowie sie z tym juz jakis czas probowalem wiele sposobow i niestety nie umiem sobie z tym poradzic...

-----

przy okazji jakby ktos mial chwilke i ochote to niech zerknie na ten temat http://forum.php.pl/index.php?showtopic=169134 bo niestety z tym tez sobie jeszcze nie poraddzilem :/


z gory dzieki wszystkim ktorzy przynajmniej sprobowali pomoc
trafas
Witam,

W twoim zapytaniu masz dwa błędy:
  1. SELECT
  2. idzaw,
  3. nazwisko,
  4. imie,
  5. skrotkl, -- BRAK PRZECINKA
  6. (SELECT sinclair FROM wyniki ORDER BY sinclair DESC LIMIT 10) -- TO ZAPYTANIE ZWRÓCI CI WIĘCEJ NIŻ JEDEN WYNIK, WIĘC JEST BŁĘDNE - MOŻE BYĆ TYLKO DOPASOWANIE 1 = 1
  7. FROM wyniki
  8. WHERE (rok) = '2011' AND (plec) = 'm' GROUP BY idzaw


Aby zrobić sortowanie przed grrupowaniem będziesz musiał skorzystać z tabeli pomocniczej.

Mając tabelę:
  1. CREATE TABLE wyniki
  2. (
  3. idzaw int,
  4. nazwisko varchar(50),
  5. imie varchar(50),
  6. skrotkl varchar(40),
  7. sinclair varchar(20),
  8. rok int,
  9. plec char
  10. )


z danymi:
  1. INSERT INTO wyniki VALUES(1,'test1','test1','t1','st1',2011,'m');
  2. INSERT INTO wyniki VALUES(2,'test2','test2','t2','st4',2011,'m');
  3. INSERT INTO wyniki VALUES(3,'test3','test3','t3','st3',2011,'m');
  4. INSERT INTO wyniki VALUES(4,'test4','test4','t4','st2',2011,'m');
  5. INSERT INTO wyniki VALUES(3,'test3','test3','t3','st8',2011,'m');


Tworzysz sobie tabelę pomocniczą z kolejnością sortowania:

  1. CREATE TABLE kolejnosc (
  2. id int AUTO_INCREMENT PRIMARY KEY,
  3. sinc varchar(20)
  4. )


i wrzucasz do niej dane z twojego zapytania:

  1. INSERT INTO kolejnosc (sinc)
  2. SELECT sinclair FROM wyniki ORDER BY sinclair DESC LIMIT 10


W zapytaniu głównym pobierasz już interesujące cię dane z sortowaniem wg. id tabeli pomocniczej:

  1. SELECT
  2. idzaw,
  3. nazwisko,
  4. imie,
  5. skrotkl
  6. FROM
  7. wyniki w
  8. JOIN kolejnosc k ON k.sinc = w.sinclair
  9. WHERE
  10. (rok) = '2011'
  11. AND (plec) = 'm'
  12. GROUP BY idzaw
  13. ORDER BY k.id



Nie wiem czy dokładnie o takie cos ci chodziło - jeżeli nie to może przynajmniej przybliży cię do celu smile.gif
jymbox
kurde super dzięki bardzo za pomoc myślę że jestem dzięki Tobie o krok od rozwiązania... niby wszystko robi jak należy lecz nie wiem dlaczego nie wyświetla mi jednej pozycji konkretnie probowalem robic to przez k.sinc w.sinclair i samo sinclair i nie wyswietla mi tego a wszytsko inne jest ok :/ nie wiesz dlaczego tak sie dzieje jakim prefiksem wywolac te konkretna kolumne?

aha i ta kolumna u mnie ma wartosc decimal 10,2 ale to chyba nie ma znaczenia bo sprawdzalem na varchar 20 tak jak zalecales ale to nic nie zmienia...

ponizej moj kod wywolania petli:

  1. <?php
  2.  
  3.  
  4.  
  5.  
  6. if(mysql_num_rows($wynik) > 0) {
  7. echo "<table cellpadding=\"2\" border=\"1\" align=\"center\">";
  8. echo "<tr><td><strong>L.p.</strong></td><td><strong>Nazwisko i imie</strong></td><td><strong>Klub</strong></td><td><strong>PKT</strong></td>";
  9.  
  10. $lp= 1;
  11. while ($lp <= 1 ) {
  12. while($o = mysql_fetch_assoc($wynik)) {
  13.  
  14. echo "<tr>";
  15. echo "<td>".$lp++."</td>";
  16. echo "<td>".$o['nazwisko']." ".$o['imie']."</td>";
  17. echo "<td>".$o['skrotkl']."</td>";
  18. echo "<td><center>".$o['sinclair']."</center></td>"; // TUTAJ PROBOWALEM ZAMIAST ".$o['sinclair']." WSTAWIAC ".$o['sinclair']." I ".$o['sinc']." I ".$o['k.sinc']." I ".$o['w.sinclair']." I NIESTETY NIC NIE ZWRACALO MI REKORDOW :/
  19. echo "</tr>";
  20. }
  21. echo "</table>";
  22. }
  23. }
  24. ?>



teraz jeszcze male pytanko bo nie wiem czy sie w ogole brac za to... mianowice ze da rade zaautomatyzowac to tak aby po dodaniu rekordow do tabeli wyniki automatycznie kasowaly sie stare rekordy z tabeli kolejnosc i wstawialy nowe juz z nowym rekordem wstawionym do tabeli wyniki?
trafas
Czyszczenie / kasowanie tabeli kolejnosc możesz zrobić na trigerze przy dodawaniu nowej wartości do tabeli wyniki.

Co do niewyświetlania się wartości z kolumny k.sinc czy w.sinclair: w zapytaniu nie masz ujętej tej kolumny, więc do główengo selecta musisz jądodać:

  1. SELECT
  2. idzaw,
  3. nazwisko,
  4. imie,
  5. skrotkl,
  6. w.sinclair
  7. FROM
  8. wyniki w
  9. JOIN kolejnosc k ON k.sinc = w.sinclair
  10. WHERE
  11. (rok) = '2011'
  12. AND (plec) = 'm'
  13. GROUP BY idzaw
  14. ORDER BY k.id


Wtedy powinny ci wyjść wartości.

Typ kolumny w zasadzie nie ma znaczenia, chodzi przecież o sortowanie.

Pozdrawiam.
jymbox
niestety nie zwraca tak najwiekszego rekordu z powtarzalnego idzaw tylko najmniejszy sad.gif
Pilsener
Najpierw wykonywane jest grupowanie, potem sortowanie, dlatego sortować można dopiero wyniki już pogrupowane smile.gif
Problem ten jest widoczny, kiedy chcemy przy ID artykułu wyświetlić np. ostatni komentarz. Rozwiązań jest parę (zależnie od sytuacji):
  1. SELECT * FROM articles
  2. LEFT JOIN (SELECT * FROM articles_comments WHERE article=1 ORDER BY id DESC) AS articles_comments ON articles.id=articles_comments.article
  3. WHERE articles.id=1
  4. GROUP BY articles.id


Zazwyczaj używa się podzapytań (w części from, join a nawet where) lub joinuje tą samą tabelę, by wyświetlić błąd użyj:


jymbox
dzieki za zainteresowanie sie moim tematem ale ono nie zwraca zadnych rekordow
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.