Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Wyciagniecie najmniejszej wartosci z bazy danych
arfer
post
Post #1





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 23.04.2012

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


Witam
Mam takie oto zapytanie do bazy danych ktore zwraca mi najmniejsza wartosc dla danego parametru (wyscig_name) i okreslonego uzytkownika. Wszystko dziala prawidlowo do czasu gdy chce dodac najmniejsza wartosc danego parametru bez podzialu na uzytkownikow (pogrubione). Problem jest taki ze zwraca mi 1 najmniejszy wynik w bazie i powtarza go na wszystkich parametrach. Jesli wyciagne go z nawiasu i dodam do reszty select to dziala ale podaje wyniki tylko wybranego kierowcy (where) a chce aby obok jego wynikow byly najmniejsze wyniki ze wszystkich kierowcow w bazie. Czy ktos wiec jak to zapisac?

  1. $result = dbquery("SELECT zespol_name, wyscig_id, MIN(wynik) AS wynik,
  2. (SELECT MIN(wynik) FROM ".DB_WYNIKI." WHERE sesja_id IN (1,2,3,4)) AS mini_wynik
  3. FROM ".DB_WYNIKI."
  4. LEFT JOIN ".DB_WYSCIGI." USING(wyscig_id)
  5. LEFT JOIN ".DB_ZESPOLY." USING(zespol_id)
  6. WHERE sesja_id IN (1,2,3,4) AND kierowca_id='".$_GET['kierowca_id']."'
  7. GROUP BY wyscig_name
  8. ");
Go to the top of the page
+Quote Post
muniekw
post
Post #2





Grupa: Zarejestrowani
Postów: 243
Pomógł: 22
Dołączył: 1.06.2009
Skąd: Warszawa

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


Próbowałeś zapisać użytkowników jako LEFT JOIN ?
Go to the top of the page
+Quote Post
arfer
post
Post #3





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 23.04.2012

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


Jaki mialoby to sens? Ja nie musze wyciagac zadnych informacji z tabeli kierowcy tylko z tabeli wyniki. Zrobilem skrypt ktory porownuje wartosci poszczegolnych kierowcow z najmniejszymi wartosciami w ogole. W bazie wyniki podane sa tylko id danego kierowcow po czym lacze go z konkretna osoba.

Chodzi mi o wyciagniecie minimalnej wartosci z bazy danych i teraz uwaga dla wybranego kierowcy i dla wszystkich kierowcow. Dopiero raczkuje w php i nie wiem jak zapisac drugie select min(wynik) tak aby ominac where dla kierowca_id ktore obowiazuje dla wszystkich pozostalych wartosci. Zapisalem to w nawiasie ale wtedy znajduje tylko jeden najmniejszy wynik a ja zrobilem tabele w ktorej pokazywane sa wyniki kazdego wyscigu. Zobrazuje to :

TAK CHCE ABY WYGLADALO
Wyscig 1 - minimalna wartosc kierowcy dla tego wyscigu* - minimalna wartosc w ogole dla tego wyscigu (np 2)**
Wyscig 2 - minimalna wartosc kierowcy dla tego wyscigu* - minimalna wartosc w ogole dla tego wyscigu (np 1)**
Wyscig 3 - minimalna wartosc kierowcy dla tego wyscigu* - minimalna wartosc w ogole dla tego wyscigu (np 3)**
itd.

* MIN(wynik) WHERE sesja_id IN (1,2,3,4) AND kierowca_id='".$_GET['kierowca_id']."'
** MIN(wynik) WHERE sesja_id IN (1,2,3,4)

TAK WYGLADA Z OBECNYM KODEM
Wyscig 1 - minimalna wartosc kierowcy dla tego wyscigu - minimalna wartosc w ogole ze wszystkich wyscigow (1)
Wyscig 2 - minimalna wartosc kierowcy dla tego wyscigu - minimalna wartosc w ogole ze wszystkich wyscigow (1)
Wyscig 3 - minimalna wartosc kierowcy dla tego wyscigu - minimalna wartosc w ogole ze wszystkich wyscigow (1)
itd.

Czy ktos mnie rozumie? (IMG:style_emoticons/default/tongue.gif)

Ten post edytował arfer 30.04.2012, 13:39:19
Go to the top of the page
+Quote Post
mortus
post
Post #4





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


W podzapytaniu brakuje warunku, który określałby o jaki wyścig chodzi. Ciężko to zapytanie w ogóle pojąć bez informacji odnośnie struktury tabel i relacji, ale możliwe, że chodziłoby o coś takiego:
  1. SELECT w1.zespol_name, w1.wyscig_id, MIN(w1.wynik) AS wynik,
  2. (SELECT MIN(w2.wynik) FROM " . DB_WYNIKI . " w2 WHERE w2.sesja_id IN (1,2,3,4) AND w2.wyscig_id = w1.wyscig_id) AS mini_wynik
  3. FROM " . DB_WYNIKI . " w1
  4. LEFT JOIN " . DB_WYSCIGI . " USING(wyscig_id)
  5. LEFT JOIN " . DB_ZESPOLY . " USING(zespol_id)
  6. WHERE sesja_id IN (1,2,3,4) AND kierowca_id = '" . $_GET['kierowca_id'] . "'
  7. GROUP BY wyscig_name
Go to the top of the page
+Quote Post
muniekw
post
Post #5





Grupa: Zarejestrowani
Postów: 243
Pomógł: 22
Dołączył: 1.06.2009
Skąd: Warszawa

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


Pisząc odpowiedź chodziło mi o to, że LEFT JOIN wybiera rekordy jeśli warunek jest spełniony. Jeśli warunek nie istnieje to takich rekordów nie doklei.
Go to the top of the page
+Quote Post
mortus
post
Post #6





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


Cytat(muniekw @ 30.04.2012, 15:06:08 ) *
Pisząc odpowiedź chodziło mi o to, że LEFT JOIN wybiera rekordy jeśli warunek jest spełniony. Jeśli warunek nie istnieje to takich rekordów nie doklei.

Nie w tym przypadku kolego. Tutaj złączenia są wykonywane najpierw, a warunek w klauzuli WHERE służy do wyselekcjonowania odpowiednich rekordów z już połączonych tabel. Warunek w klauzuli WHERE nie jest tutaj warunkiem złączenia tabel.

Ten post edytował mortus 30.04.2012, 14:12:17
Go to the top of the page
+Quote Post
arfer
post
Post #7





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 23.04.2012

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


Jesli zapisze w Select w1.zespol_name to zwroci mi brak takiej kolumny w tabeli:

Unknown column 'w1.zespol_name' in 'field list'
Go to the top of the page
+Quote Post
mortus
post
Post #8





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


Cytat(arfer @ 30.04.2012, 15:29:24 ) *
Jesli zapisze w Select w1.zespol_name to zwroci mi brak takiej kolumny w tabeli:

Unknown column 'w1.zespol_name' in 'field list'

A zobacz, co masz w trzeciej linijce zapytania, które napisałem. Tam dodajesz alias w1 dla tabeli DB_WYNIKI. Zrobiłeś to?
Go to the top of the page
+Quote Post
arfer
post
Post #9





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 23.04.2012

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


Tak. Teraz moj kod wyglada tak:
  1. $result = dbquery("SELECT w1.zespol_name, w1.wyscig_id, MIN(w1.wynik) AS wynik,
  2. (SELECT MIN(w2.wynik) FROM " . DB_WYNIKI . " w2 WHERE w2.sesja_id IN (1,2,3,4) AND w2.wyscig_id = w1.wyscig_id) AS mini_wynik
  3. FROM " . DB_WYNIKI . " w1
  4. LEFT JOIN ".DB_WYSCIGI." USING(wyscig_id)
  5. LEFT JOIN ".DB_ZESPOLY." USING(zespol_id)
  6. WHERE sesja_id IN (1,2,3,4) AND kierowca_id='".$_GET['kierowca_id']."'
  7. GROUP BY wyscig_name
  8. ");


Wiem w czym tkwi problem nie wiem jak go rozwiazac. Wszystkie wartosci w select sa ze soba powiazane dlatego robiac tabele z wyswietlanymi kolejno wynikami while ($data = dbarray($result)) wyswietla mi najnizsza wartosc danego kierowcy dla kazdego wyscigu a 2 min wynik odseparowalem w nawiasie i odczytuje to jako wybierz najnizsza wartosc w ogole a nie najnizsza wartosc dla danego wyscigu.
Go to the top of the page
+Quote Post
mortus
post
Post #10





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


Cytat(arfer @ 30.04.2012, 15:40:57 ) *
Wiem w czym tkwi problem nie wiem jak go rozwiazac. Wszystkie wartosci w select sa ze soba powiazane dlatego robiac tabele z wyswietlanymi kolejno wynikami while ($data = dbarray($result)) wyswietla mi najnizsza wartosc danego kierowcy dla kazdego wyscigu a 2 min wynik odseparowalem w nawiasie i odczytuje to jako wybierz najnizsza wartosc w ogole a nie najnizsza wartosc dla danego wyscigu.

No przecież o tym pisałem w pierwszej odpowiedzi. Jak wyglądają tabele w bazie danych (przynajmniej tabela DB_WYNIKI, chociaż struktura pozostałych tabel również mogłaby się przydać). Funkcja dbarray() to Twoja własna funkcja? Jak ona wygląda?
Go to the top of the page
+Quote Post
arfer
post
Post #11





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 23.04.2012

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


Tak wyglada caly moj kod :

  1. $result = dbquery("SELECT w1.zespol_name, w1.wyscig_name, MIN(w1.wynik) AS wynik,
  2. (SELECT MIN(w2.wynik) FROM " . DB_WYNIKI . " w2 WHERE w2.sesja_id IN (1,2,3,4) AND w2.wyscig_id = w1.wyscig_id) AS mini_wynik
  3. FROM " . DB_WYNIKI . " w1
  4. LEFT JOIN ".DB_WYSCIGI." USING(wyscig_id)
  5. LEFT JOIN ".DB_ZESPOLY." USING(zespol_id)
  6. WHERE sesja_id IN (1,2,3,4) AND kierowca_id='".$_GET['kierowca_id']."'
  7. GROUP BY wyscig_name
  8. ");
  9.  
  10. if(dbrows($result) > 0)
  11.  
  12. echo "
  13. <table align='center' style=' border-collapse: collapse; margin-top: ' width='100%' bgcolor='#FFFFFF'>
  14. <tr>
  15. <td colspan='5' style='border: 1px solid black; border-collapse: collapse; padding: 10px;'><b>Przebieg kariery</b></td>
  16. </tr>
  17. <tr>
  18. <td style='border: 1px solid black; border-collapse: collapse; padding: 5px;'>Wyscig</td>
  19. <td style='border: 1px solid black; border-collapse: collapse; padding: 5px;'>Zespół</td>
  20. <td style='border: 1px solid black; border-collapse: collapse; padding: 5px;'>Indywidualny najlepszy czas</td>
  21. <td style='border: 1px solid black; border-collapse: collapse; padding: 5px;'>Najlepszy czas tygodnia</td>
  22. <td style='border: 1px solid black; border-collapse: collapse; padding: 5px;'>Strata</td>
  23. </tr>";
  24. while ($data = dbarray($result))
  25. {
  26. echo "
  27. <tr>
  28. <td style='border: 1px solid black; border-collapse: collapse; padding: 5px;'>".$data['wyscig_name']."</td>
  29. <td style='border: 1px solid black; border-collapse: collapse; padding: 5px;'>".$data['zespol_name']."</td>
  30. <td style='border: 1px solid black; border-collapse: collapse; padding: 5px;'>".$data['wynik']."</td>
  31.  
  32.  
  33.  
  34. <td style='border: 1px solid black; border-collapse: collapse; padding: 5px;'>".$data['mini_wynik']."</td>
  35. <td style='border: 1px solid black; border-collapse: collapse; padding: 5px;'>".(strata($max, $data['wynik']))."</td>
  36.  
  37. </tr> ";
  38.  
  39. }
  40.  
  41. echo "</table>";


Funkcja straty jest niewazna wiec jej nie kopiowalem. Skrypt pobiera rekordy z bazy wyniki gdzie sa kolumny sesja_id (wezmie tylke te gdzie bedzie 1,2,3,4) zespol_id i wyscig_id (przeksztalci na nazwy w left join using...) wynik i kierowca_id.
Wszystko dziala przy kodzie zamieszczonym w 1 poscie z tym ze najlepszy wynik dla wszystkich kierowcow zwraca ciagle ta sama najnizsza wartosc z calej tabeli nie zwracajac uwage na odwolanie do wyscigow. Jak zrobic by pokazywalo najnizsza wartosc dla wszystkich kierowcow poszczegolnych wyscigow.

Ten post edytował arfer 30.04.2012, 15:02:16
Go to the top of the page
+Quote Post
mortus
post
Post #12





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


Cały czas rozchodziło się o strukturę tabeli wyniki, której nam nigdzie nie podałeś. Teraz przynajmniej opis jest dokładniejszy i można coś kombinować:
  1. SELECT zespol_name, wyscig_name, MIN(w1.wynik) AS wynik,
  2. (SELECT MIN(w2.wynik) FROM " . DB_WYNIKI . " w2 WHERE w2.sesja_id IN (1,2,3,4) AND w2.wyscig_id = w1.wyscig_id) AS mini_wynik
  3. FROM " . DB_WYNIKI . " w1
  4. LEFT JOIN " . DB_WYSCIGI . " USING(wyscig_id)
  5. LEFT JOIN " . DB_ZESPOLY . " USING(zespol_id)
  6. WHERE sesja_id IN (1,2,3,4) AND kierowca_id = '" . $_GET['kierowca_id'] . "'
  7. GROUP BY wyscig_name

Powinno zadziałać, jeśli tylko kolumny zespol_name i wyscig_name są unikalne w "obrębie" wszystkich tabel, tzn. nie powtarzają się w dwóch tabelach.

Ten post edytował mortus 30.04.2012, 15:20:07
Go to the top of the page
+Quote Post
arfer
post
Post #13





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 23.04.2012

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


Bingo Mortus (IMG:style_emoticons/default/smile.gif) Dziala. Wielkie dzieki (IMG:style_emoticons/default/smile.gif)
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: 25.08.2025 - 12:25