Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Pobieranie najmniejszych wynikow
arfer
post
Post #1





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

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


Witam mam problem ze zrobieniem zapytania ktore pobiera najmniejszy wynik dla danego usera w danym obiekcie (wynik) oraz najmniejszy wynik w ogole w danym obiekcie (mini_wynik). Problem polega na tym ze w bazie wyniki nie mam kolumny obiekt_id a jedynie wydarzenie_id ktore sa polaczone z obiektami w osobnej tabeli. (wiele wydarzen moze byc rozgrywanych na danym obiekcie) Zapytanie ktore mam dziala poprawnie ale mini_wynik pobierane jest dla danego wydarzenia a nie obiektu czyli jesli najmniejszy wynik usera zostal zrobiony w wydarzeniu z 2008 roku to mini_wynik wskaze najmniejszy wynik dla tego wydarzenia z 2008 roku mimo ze na tym obiekcie byly nizsze wyniki np w wydarzeniu z 2010 roku. Probowalem zmienic w2.wydarzenie_id = w1.wydarzenie_id na w2.obiekt_id = w1.obiekt_id ale to nie dziala najprawdopodobniej dlatego ze nie ma w bazie wyniki takiej kolumny jak obiekt. Czy ktos moze pomoc mi poprawic te zapytanie?


tabela wyniki zawiera kolumny wynik, sesja, wydarzenie
tabela wydarzenia zawiera wydarzenie, obiekt

Kod
Select obiekt_name, MIN(w1.wynik) AS wynik,
(SELECT MIN(w2.wynik) FROM " . DB_WYNIKI . " w2 WHERE w2.sesja_id IN (1,2,3,4) AND w2.wydarzenie_id = w1.wydarzenie_id) AS mini_wynik
FROM " . DB_WYNIKI . " w1
   LEFT JOIN " . DB_WYDARZENIA . " USING(wydarzenie_id)
  LEFT JOIN " . DB_OBIEKTY . " USING(obiekt_id)
  WHERE sesja_id IN (1,2,3,4) AND user_id = '" . $_GET['user_id'] . "'
  GROUP BY obiekt_name


Ten post edytował arfer 22.02.2013, 23:03:59
Go to the top of the page
+Quote Post
netmare
post
Post #2





Grupa: Zarejestrowani
Postów: 285
Pomógł: 37
Dołączył: 18.12.2007
Skąd: Łódź

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


Możesz podać strukturę tabelek i wyniku który byś chciał?
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%)
-----


W moim 1 poscie wkradl sie blad w nazewnictwie tabel juz go poprawilem.
Chcialbym zeby mini_wynik byl pobierany dla takiego samego obiektu jak wynik (teraz jest pobierane dla tego samego wydarzenia.)

W ogolnym rozrachunku wyswietlane byloby cos takiego.

OBIEKT - MIN WYNIK USERA - MIN WYNIK DLA TEGO OBIEKTU
Obiekt 1 - 128 - 117
Obiekt 2 - 154 - 150
Obiekt 3 - 122 - 121
itd..

Na obiekcie 1 byly trzy wydarzenia 2008,2009 i 2010.
Dany user swoj najmniejszy wynik 128 zrobil w 2008.
Aktualne moje zapytanie pobiera najmniejszy wynik w tym wydarzeniu 2008 czyli 125 ale w wydarzeniu 2010 byly znacznie nizsze wyniki - najnizszy 117. I chcialbym tak zmodyfikowac te zapytanie zeby pobieralo najmniejszy wynik dla tego obiektu czyli 117 a nie wydarzeniu w ktorym dany user zrobil najnizszy wynik.

Ten post edytował arfer 22.02.2013, 23:08:33
Go to the top of the page
+Quote Post
netmare
post
Post #4





Grupa: Zarejestrowani
Postów: 285
Pomógł: 37
Dołączył: 18.12.2007
Skąd: Łódź

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


Dalej nic nie rozumiem wink.gif
Przetłumacz:
Cytat(arfer @ 22.02.2013, 22:58:28 ) *
Obiekt 1 - 128 - 117
Obiekt 2 - 154 - 150
Obiekt 3 - 122 - 121


na
Cytat(arfer @ 22.02.2013, 21:41:26 ) *
najmniejszy wynik dla danego usera w danym obiekcie (wynik) oraz najmniejszy wynik w ogole w danym obiekcie (mini_wynik).


a najlepiej byłoby jakbyś poświęcił chwilę i rozpisał wynik:id_wynik,id_obiekt,id_user obiekt: ... czy jak kolwiek to wygląda przynajmniej w zakresie kolumn potrzebnych do złączenia, wyświetlenia lub agragacji.

Edit po raz drugi:
Rozumiem co chcesz poprawić ale nie rozumiem co wycinasz id_sesji, nie rozumiem idei która przyświecała Ci przy LEFT JOIN, nie rozumiem co w MYSQL-u oznacza USING przy LEFT JOINIE, dlatego jakbyś wrzucił struktury byłoby lepiej, ale strzleam coś jak:

  1. SELECT
  2. gracz.*,
  3. MIN(w.wynik)
  4. FROM
  5. (
  6. SELECT
  7. o.obiekt_id,
  8. o.obiekt_name,
  9. MIN(d.wynik) AS wynik
  10. FROM
  11. DB_WYNIKI d
  12. INNER JOIN DB_WYDARZENIA w
  13. USING(wydarzenie_id)
  14. INNER JOIN DB_OBIEKTY o
  15. USING(obiekt_id)
  16. WHERE
  17. tutaj jakieś tam warunki choć wklejanie tego $_GET.... sam rozumiesz....
  18. GROUP BY
  19. o.obiekt_id, o.obiekt_name
  20. ) AS gracz
  21.  
  22. INNER JOIN DB_WYDARZENIA o
  23. USING (obiekt_id)
  24. INNER JOIN DB_WYNIK w
  25. USING (wydarzenie_id)
  26.  
  27. GROUP BY
  28. gracz.obiekt_id, gracz.obiekt_name, gracz.wynik


Chyba coś takiego, chociaż kiepsko się pisze nie mając struktury tabel tongue.gif

P.S. jak wcisnąłem podgląd postu to się okazało że jednak napisałeś biggrin.gif

Ten post edytował netmare 22.02.2013, 23:48:22
Go to the top of the page
+Quote Post
arfer
post
Post #5





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

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


No dokladnie tak bo w tej tabeli sa wyniki wielu userow a te zapytanie ma byc czescia stron profilowych userow. Wiec jak user wejdzie na swoja strone to pierwszy wynik bedzie jego najmniejszym wynikiem na danym obiekcie a drugi wynik bedzie w ogole najmniejszym wynikiem jaki komukolwiek udalo sie osiagnac. (np jakiemus innemu userowi)


TABELA WYNIKI
user_id - wynik - wydarzenie_id
6 - 150 - 1
7 - 154 - 1
8 - 148 - 1
7 - 128 - 2
9 - 132 - 2
10 - 136 - 2
6 - 188 - 3
7 - 198 - 3
10 - 182 - 3

TABELA WYDARZENIA
wydarzenie_id - obiekt_id

1 - 1
2 - 1
3 - 2
4 - 2
5 - 2
6 - 2
7 - 3
8 - 3

Mam nastepujace tabele

WYNIKI
uder_id, wynik, wydarzenie_id

WYDARZENIA
Wydarzenie_id, obiekt_id


Jak zmodyfikowac te zapytanie aby mini_wynik pobieral najmniejszy wyniki z bazy dla takiego samego obiektu jak wynik (aktualnie pobiera najmniejszy wynik dla takiego samego wydarzenia.)

  1. SELECT obiekt_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.wydarzenie_id = w1.wydarzenie_id) AS mini_wynik
  3. FROM " . DB_WYNIKI . " w1
  4. LEFT JOIN " . DB_WYDARZENIA . " USING(wydarzenie_id)
  5. LEFT JOIN " . DB_OBIEKTY . " USING(obiekt_id)
  6. WHERE sesja_id IN (1,2,3,4) AND user_id = '" . $_GET['user_id'] . "'
  7. GROUP BY obiekt_name


Ten post edytował arfer 22.02.2013, 23:19:47
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 Aktualny czas: 22.08.2025 - 11:12