[MySQL][PHP]Najlepszy wynik z dwóch tabel |
[MySQL][PHP]Najlepszy wynik z dwóch tabel |
25.01.2013, 17:35:13
Post
#1
|
|
Grupa: Zarejestrowani Postów: 57 Pomógł: 0 Dołączył: 5.03.2011 Ostrzeżenie: (0%) |
Witam ponownie, męczę się z tym cały dzień i nie mogę dojść jak to zrobić. Otóż pobieram sobie dane z bazy z 2 tabel. Potrzebuję aby z tych tabel wyświetlało mi tylko najlepsze wyniki (najkrótszy czas)
To co napisałem:
Wynikiem tego jest: (single) ID: 1 Nick: JOERG1966 Marka: MCLAREN Model: F1 Czas: 0:01:13.800 ID: 2 Nick: RYBECKI0902 Marka: PAGANI Model: ZONDA CINQUE Czas: 0:01:16.675 ID: 3 Nick: MANIEK2512PL Marka: PAGANI Model: ZONDA CINQUE Czas: 0:01:17.463 (multi) ID: 1 Nick: JOERG1966 Marka: MCLAREN Model: F1 Czas: 0:01:09.435 ID: 2 Nick: DELECTAMENTI Marka: PAGANI Model: ZONDA CINQUE Czas: 0:01:12.861 ID: 3 Nick: MANIEK2512PL Marka: PAGANI Model: ZONDA CINQUE Czas: 0:01:19.817 ID: 4 Nick: BLACKSHADOW849 Marka: PAGANI Model: ZONDA CINQUE Czas: 0:01:21.805 ID: 5 Nick: RYBECKI0902 Marka: PAGANI Model: ZONDA CINQUE Czas: 0:01:23.075 Chciałym z tych 2 "tabel" stworzyć 1, która względem powyższych danych wyglądałaby tak: 1. Nick: JOERG1966 Marka: MCLAREN Model: F1 Czas: 0:01:09.435 Tryb: single 2. Nick: DELECTAMENTI Marka: PAGANI Model: ZONDA CINQUE Czas: 0:01:12.861 Tryb: multi 3. Nick: RYBECKI0902 Marka: PAGANI Model: ZONDA CINQUE Czas: 0:01:16.675 Tryb: single 4. Nick: MANIEK2512PL Marka: PAGANI Model: ZONDA CINQUE Czas: 0:01:17.463 Tryb: single 5. Nick: BLACKSHADOW849 Marka: PAGANI Model: ZONDA CINQUE Czas: 0:01:21.805 Tryb: multi Mógłby mi ktoś podpowiedzieć, podać jakiś przykład jak to zrobić? |
|
|
25.01.2013, 17:45:22
Post
#2
|
|
Grupa: Zarejestrowani Postów: 279 Pomógł: 36 Dołączył: 1.03.2012 Ostrzeżenie: (0%) |
np. UNION i po problemie. Tutaj jakiś kurs. Całość załatwiasz jednym zapytaniem.
Ten post edytował kristaps 25.01.2013, 17:58:57 |
|
|
25.01.2013, 18:09:42
Post
#3
|
|
Grupa: Zarejestrowani Postów: 57 Pomógł: 0 Dołączył: 5.03.2011 Ostrzeżenie: (0%) |
Dobra zmieniłem na coś takiego, teraz tylko jak napisać warunek aby pobierało tylko najlepszy (najkrótszy) czas z tych tabel? Do tego trzeba by było dopisać czy jest to multi czy single.
|
|
|
25.01.2013, 18:18:21
Post
#4
|
|
Grupa: Zarejestrowani Postów: 279 Pomógł: 36 Dołączył: 1.03.2012 Ostrzeżenie: (0%) |
|
|
|
25.01.2013, 18:25:37
Post
#5
|
|
Grupa: Zarejestrowani Postów: 57 Pomógł: 0 Dołączył: 5.03.2011 Ostrzeżenie: (0%) |
Chodzi mi o to aby pobierało najkrótszy czas z tych 2 tabel dla każdego z graczy.
Np. osoba1 przejechała trasę na single z czasem 1:20 a na multi z czasem 1:18 Wynikiem czego pokaże się tylko ten lepszy czas wraz z informacją czy był to wyścig na multi czy single (opcjonalnie, choć dobrze by było) Chciałbym aby czasy wyświetlały się dla każdej z osób. Czyli musiałoby porównać czasy z single i multi dla każdego gracza i wypisać lepszy (tj. krótszy). |
|
|
25.01.2013, 18:40:43
Post
#6
|
|
Grupa: Zarejestrowani Postów: 279 Pomógł: 36 Dołączył: 1.03.2012 Ostrzeżenie: (0%) |
Jeżeli chcesz informować z której tabeli pochodzi rekord, to będziesz musiał zrezygnować z UNION. Przynajmniej mi nie wiadomo nic nt uzyskiwania informacji o tabeli. W takim przypadku najlepiej jak wrócisz do swojego pierwotnego pomysłu, ale dane będziesz pobierał jako tablice (MYSQL_ASSOC), następnie możesz je połączyć by posegregować. No ale może ktoś zna lepszy sposób.
|
|
|
25.01.2013, 19:13:59
Post
#7
|
|
Grupa: Zarejestrowani Postów: 57 Pomógł: 0 Dołączył: 5.03.2011 Ostrzeżenie: (0%) |
Niestety nie ogarniam jeszcze za bardzo php i mysql i nie poradzę sobie z tym, daltego też pytałem o jakieś przykłady. Większości nauczyłem się właśnie w ten sposób i często jak czegoś nie wiem korzystam z poprzednich rozwiązań. Czegoś takiego nigdy nie robiłem, a do tego ciężko znaleźć jaką kolwiek pomoc w necie na ten temat.
Zupełnie nie wiem jak z tych dwóch tablic wybrać tylko najlepszy czas dla danego gracza. Jeśli ktoś byłby tak uprzejmy i napisał rozwiązanie tego pytania (+ o ile byłaby taka możliwość z jakimś wytłumaczeniem co z czym się je, byłbym dozgonnie wdzięczny). Będę sam próbował się jeszcze jakoś z tym uporać lecz po całym dniu prób ręce same opadają.. Jak narazie zrobiłem tyle:
Może można tu zastosować jakoś array_unique z tym, że trzeba było ją posortować i wtedy pokazywało by tylko wyniki, które pokazały się jako pierwsze? Tylko nie wiem, czy można ustawić w array_unique, która wartość ma być unikalna. Mógłby ktoś się wypowiedzieć na ten temat? Ten post edytował maniek2512 25.01.2013, 21:24:19 |
|
|
25.01.2013, 21:39:01
Post
#8
|
|
Grupa: Zarejestrowani Postów: 279 Pomógł: 36 Dołączył: 1.03.2012 Ostrzeżenie: (0%) |
Możesz zacząć tak:
Edit: Widzę, że wrzuciłeś swoją propozycję. Zostałeś przy UNION, więc pewnie wykorzystasz kolejne zapytanie do wyświetlenia danych z multi i single. Też jakieś wyjście, ale też kolejne zapytanie. Array_unique po prostu usuwa duplikaty podczas wyświetlania. Ten post edytował kristaps 25.01.2013, 21:37:48 |
|
|
25.01.2013, 21:53:57
Post
#9
|
|
Grupa: Zarejestrowani Postów: 57 Pomógł: 0 Dołączył: 5.03.2011 Ostrzeżenie: (0%) |
Możesz zacząć tak:
Edit: Widzę, że wrzuciłeś swoją propozycję. Zostałeś przy UNION, więc pewnie wykorzystasz kolejne zapytanie do wyświetlenia danych z multi i single. Też jakieś wyjście, ale też kolejne zapytanie. Array_unique po prostu usuwa duplikaty podczas wyświetlania. Nie wiem czy do końca zrozumiałeś o co mi chodzi. Postaram się to lepiej wytłumaczyć. W bazie danych mam aktualizowane na bierząco (Cron lub po kliknięciu aktualizuj przez użytkownika) czasy do multi i do single dla każdego gracza (jest tam po jednym czasie dla multi i dla single) Chodzi mi tu tylko o to, że przy pobieraniu danych z bazy (wszystkich graczy) pokazują się czasy z single i z multi, a ja chciałbym aby pokazywany był tylko ten lepszy czas. Czyli tak jak napisałem w 1 poście: tabela 1- (single) ID: 1 Nick: JOERG1966 Marka: MCLAREN Model: F1 Czas: 0:01:13.800 ID: 2 Nick: RYBECKI0902 Marka: PAGANI Model: ZONDA CINQUE Czas: 0:01:16.675 ID: 3 Nick: MANIEK2512PL Marka: PAGANI Model: ZONDA CINQUE Czas: 0:01:17.463 tabela 2- (multi) ID: 1 Nick: JOERG1966 Marka: MCLAREN Model: F1 Czas: 0:01:09.435 ID: 2 Nick: DELECTAMENTI Marka: PAGANI Model: ZONDA CINQUE Czas: 0:01:12.861 ID: 3 Nick: MANIEK2512PL Marka: PAGANI Model: ZONDA CINQUE Czas: 0:01:19.817 ID: 4 Nick: BLACKSHADOW849 Marka: PAGANI Model: ZONDA CINQUE Czas: 0:01:21.805 ID: 5 Nick: RYBECKI0902 Marka: PAGANI Model: ZONDA CINQUE Czas: 0:01:23.075 Chciałym z tych 2 "tabel" stworzyć 1, która względem powyższych danych wyglądałaby tak: tabela 3-razem 1. Nick: JOERG1966 Marka: MCLAREN Model: F1 Czas: 0:01:09.435 Tryb: single 2. Nick: DELECTAMENTI Marka: PAGANI Model: ZONDA CINQUE Czas: 0:01:12.861 Tryb: multi 3. Nick: RYBECKI0902 Marka: PAGANI Model: ZONDA CINQUE Czas: 0:01:16.675 Tryb: single 4. Nick: MANIEK2512PL Marka: PAGANI Model: ZONDA CINQUE Czas: 0:01:17.463 Tryb: single 5. Nick: BLACKSHADOW849 Marka: PAGANI Model: ZONDA CINQUE Czas: 0:01:21.805 Tryb: multi Co do trybu pomyślałem, że dodam po prostu nowy rekord w którym będzie informacja czy czas jest z trybu single czy z trybu multi, a następie zostanie wyświetlona obok razem z pozostałymi danymi, więc to już najmniejszy problem. Aby było jeszcze jaśniej, obecnie po pobraniu i posortowaniu danych z bazy wyświetla mi się taka tabelka: Chciałbym aby wyświetlała się taka jak tabelka 3-razem (wyżej) Ten post edytował maniek2512 25.01.2013, 21:58:16 |
|
|
25.01.2013, 22:20:48
Post
#10
|
|
Grupa: Zarejestrowani Postów: 279 Pomógł: 36 Dołączył: 1.03.2012 Ostrzeżenie: (0%) |
Teraz już rozumiem.
1. Nie rób tabeli, kolumny, rekordu czy czegokolwiek, by rozróżniać nazwę tabeli. To zła praktyka. 2. Najłatwiej to zrobić nadal przez 2 pytania. Następnie:
Tabelę dostosuj do własnych potrzeb. Ten post edytował kristaps 25.01.2013, 22:21:18 |
|
|
25.01.2013, 22:47:22
Post
#11
|
|
Grupa: Zarejestrowani Postów: 57 Pomógł: 0 Dołączył: 5.03.2011 Ostrzeżenie: (0%) |
Nie wiem, chyba coś pochrzaniłem.. ;|
Pokazuje mi tylko jeden rekord, a mianowicie: Nick: RYBECKI0902 Marka: PAGANI Czas 0:01:23.075
|
|
|
25.01.2013, 23:10:03
Post
#12
|
|
Grupa: Zarejestrowani Postów: 279 Pomógł: 36 Dołączył: 1.03.2012 Ostrzeżenie: (0%) |
Bo nie wrzuciłeś tego w żadną pętlę. Dlatego zapytanie wykonane zostało tylko raz. Ok, założyłem, że masz tabelę z graczami:
Pętla wykona się tyle razy, ile masz użytkowników w bazie. Równie dobrze możesz dać tam pętlę for, czy inną. Ten post edytował kristaps 25.01.2013, 23:04:35 |
|
|
25.01.2013, 23:30:47
Post
#13
|
|
Grupa: Zarejestrowani Postów: 57 Pomógł: 0 Dołączył: 5.03.2011 Ostrzeżenie: (0%) |
W bazie danych mam nazwy tras w nich mam rekordy, np:
multi39: id nick marka model czas ban Z tej bazy pobierane są wszystkie dane potrzebne do wyświetlenia czasów łącznie z nickiem gracza. edit:/// Zrobiłem coś takiego:
lecz nie wiedzieć czemu zwraca to taki wynik: Nick: JOERG1966 Marka: MCLAREN Czas 0:01:09.435 Nick: DELECTAMENTI Marka: PAGANI Czas 0:01:12.861 Nick: MANIEK2512PL Marka: PAGANI Czas 0:01:17.463 Nick: MANIEK2512PL Marka: PAGANI Czas 0:01:17.463 Nick: MANIEK2512PL Marka: PAGANI Czas 0:01:17.463 Ten post edytował maniek2512 26.01.2013, 03:17:32 |
|
|
26.01.2013, 03:55:28
Post
#14
|
|
Grupa: Zarejestrowani Postów: 279 Pomógł: 36 Dołączył: 1.03.2012 Ostrzeżenie: (0%) |
Dzieje się tak pewnie z powodu braku jakiekolwiek warunku w zapytaniu. Sprawdź taki kod:
Tylko nie usuwaj warunków i wklej co otrzymałeś. Ten post edytował kristaps 26.01.2013, 04:08:35 |
|
|
26.01.2013, 12:50:54
Post
#15
|
|
Grupa: Zarejestrowani Postów: 57 Pomógł: 0 Dołączył: 5.03.2011 Ostrzeżenie: (0%) |
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/nfswinfo/public_html/reszta/staty/staty.php on line 17
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/nfswinfo/public_html/reszta/staty/staty.php on line 20 Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/nfswinfo/public_html/reszta/staty/staty.php on line 12 Nick: Marka: Czas
Zrobiłem więc tabelę, w której dodałem wszystkie nicki i zmieniłem na to:
Muszę to robić po nicku ponieważ id jest inne w single i multi (dane do mazy wysyłane są w względem miejsca np. osoba która była 1 na wyścigu ma id 1, czyli jeśli na jednym wyścigu w trybie single osoba1 jest 1, a w trybie multi jest 2 ma dwa różne id, a więc zamiast id musiałem dać po nicku) Niestety pokazuje tylko jeden wynik (dla ostatniej osoby z tabeli- CHICANE) Nick: BLACKSHADOW849 Marka: PAGANI Czas 0:01:21.805 Czyli znów coś z pętlą jest nie tak. edit:// Zrobiłem tak, teraz powtarza mi się tylko jeden z rekordów oraz nie wyświetla mi się czas gracza BLACKSHADOW849: (Może tak być dlatego, że nie każdy jeździł tryb multi i nie każdy jeździł tryb single ? ) Nick: MANIEK2512PL Marka: PAGANI Czas 0:01:17.463 Nick: JOERG1966 Marka: MCLAREN Czas 0:01:09.435 Nick: RYBECKI0902 Marka: PAGANI Czas 0:01:16.675 Nick: DELECTAMENTI Marka: PAGANI Czas 0:01:12.861 Nick: RYBECKI0902 Marka: PAGANI Czas 0:01:16.675
Ten post edytował maniek2512 26.01.2013, 13:09:10 |
|
|
26.01.2013, 13:10:45
Post
#16
|
|
Grupa: Zarejestrowani Postów: 279 Pomógł: 36 Dołączył: 1.03.2012 Ostrzeżenie: (0%) |
Zmień
$wynik = '<tr><td>Nick ... na $wynik .= '<tr><td>Nick ... W obu warunkach. Ten post edytował kristaps 26.01.2013, 13:13:09 |
|
|
26.01.2013, 13:16:13
Post
#17
|
|
Grupa: Zarejestrowani Postów: 57 Pomógł: 0 Dołączył: 5.03.2011 Ostrzeżenie: (0%) |
Po zmianie na
mam coś takiego: Nick: MANIEK2512PL Marka: PAGANI Czas 0:01:17.463 Nick: MANIEK2512PL Marka: PAGANI Czas 0:01:17.463 Nick: JOERG1966 Marka: MCLAREN Czas 0:01:09.435 Nick: MANIEK2512PL Marka: PAGANI Czas 0:01:17.463 Nick: JOERG1966 Marka: MCLAREN Czas 0:01:09.435 Nick: RYBECKI0902 Marka: PAGANI Czas 0:01:16.675 Nick: MANIEK2512PL Marka: PAGANI Czas 0:01:17.463 Nick: JOERG1966 Marka: MCLAREN Czas 0:01:09.435 Nick: RYBECKI0902 Marka: PAGANI Czas 0:01:16.675 Nick: DELECTAMENTI Marka: PAGANI Czas 0:01:12.861 Nick: MANIEK2512PL Marka: PAGANI Czas 0:01:17.463 Nick: JOERG1966 Marka: MCLAREN Czas 0:01:09.435 Nick: RYBECKI0902 Marka: PAGANI Czas 0:01:16.675 Nick: DELECTAMENTI Marka: PAGANI Czas 0:01:12.861 Nick: RYBECKI0902 Marka: PAGANI Czas 0:01:16.675 |
|
|
26.01.2013, 13:22:01
Post
#18
|
|
Grupa: Zarejestrowani Postów: 279 Pomógł: 36 Dołączył: 1.03.2012 Ostrzeżenie: (0%) |
|
|
|
26.01.2013, 13:24:13
Post
#19
|
|
Grupa: Zarejestrowani Postów: 57 Pomógł: 0 Dołączył: 5.03.2011 Ostrzeżenie: (0%) |
To zapytanie nie zwraca duplikatów? Trochę to dziwne, docelowo powinieneś pobrać użytkownika, następnie dane i porównać w warunku if. Czy mniejszy czy większy - dopisać do tabeli. Kropka. To zapytanie zwraca dokładnie coś takiego: MANIEK2512PL JOERG1966 RYBECKI0902 DELECTAMENTI BLACKSHADOW849 |
|
|
26.01.2013, 13:29:24
Post
#20
|
|
Grupa: Zarejestrowani Postów: 279 Pomógł: 36 Dołączył: 1.03.2012 Ostrzeżenie: (0%) |
Problem pewnie polega na tym, że nie każdy rozgrywał single i multi.
Co teraz Ci się wyświetli? |
|
|
Wersja Lo-Fi | Aktualny czas: 16.06.2024 - 15:18 |