Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> problem z zapytaniem mysql (sortowanie przed grupowaniem)
jymbox
post
Post #1





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 2.08.2008

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


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 (IMG:style_emoticons/default/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
Go to the top of the page
+Quote Post
trafas
post
Post #2





Grupa: Zarejestrowani
Postów: 87
Pomógł: 12
Dołączył: 31.05.2006

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


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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
jymbox
post
Post #3





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 2.08.2008

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


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?
Go to the top of the page
+Quote Post
trafas
post
Post #4





Grupa: Zarejestrowani
Postów: 87
Pomógł: 12
Dołączył: 31.05.2006

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


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.
Go to the top of the page
+Quote Post
jymbox
post
Post #5





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 2.08.2008

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


niestety nie zwraca tak najwiekszego rekordu z powtarzalnego idzaw tylko najmniejszy (IMG:style_emoticons/default/sad.gif)
Go to the top of the page
+Quote Post
Pilsener
post
Post #6





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


Najpierw wykonywane jest grupowanie, potem sortowanie, dlatego sortować można dopiero wyniki już pogrupowane (IMG:style_emoticons/default/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:


Go to the top of the page
+Quote Post
jymbox
post
Post #7





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 2.08.2008

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


dzieki za zainteresowanie sie moim tematem ale ono nie zwraca zadnych rekordow
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 10.10.2025 - 08:50