Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pobieranie najmniejszych wynikow
Forum PHP.pl > Forum > Bazy danych > MySQL
arfer
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
netmare
Możesz podać strukturę tabelek i wyniku który byś chciał?
arfer
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.
netmare
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
arfer
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
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.