Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PHP/MySql - Wybranie najmniejszej liczby sposrod kilku pol
Forum PHP.pl > Forum > Bazy danych > MySQL
Yasieq
Heja. Mam baze z kolumnami:

Imie | nazwisko | czas_1 | czas_2 | czas_3 |


Jakim zapytaniem pobrac z bazy najmniejszy czas (ale rozny od 0) sposrod trzech pol z czasem?
DeyV
Kod
SELECT

   CASE

     WHEN (czas_1 > czas_2) THEN

           CASE

                 WHEN (czas_1 > czas_3)  THEN czas_1

                 ELSE czas_3

            end;

    ELSE

           CASE

                 WHEN (czas_2 > czas_3)  THEN czas_2

                 ELSE czas_3

            end;

  END;

Czy jakoś tak... Pewnie mozna prościej, ale tak też będzie działać
Yasieq
A jak ustawic sortowanie po najmniejszym z tych trzech pol?

Zalozmy, ze mam takie trzy wiersze:

Kod
Imie   |  Nazwisko  | czas_1 | czas_2 | czas_3 |

------------------------------------------------------

  1              1             1.81       1.76      1.49

--------------------------------------------------------

  2              2             2.97       1.93      1.01

--------------------------------------------------------

  3              3             1.94       1.53      1.56

--------------------------------------------------------


I chce, aby wyniki byly ulozone w kolejnosci uzyskania najnizszego czasu, czyli tak:

Jako pierwszy 2
Jako drugi 1
Jako trzeci 3
DeyV
jak już zadziała zapytanie? Dokładnie tak jak zawsze. Co najwyżej, aby uprościć sprawę ustawiasz, by porzednie wyrażenie podawane było as czas_min a następnie order by czas_min
Yasieq
Nie dziala sad.gif

Jakbys mogl zerknac w to zapytanie i powiedziec, co jest nie tak to bylbym bardzo wdzieczny (uproscilem je na razie do dwoch pol z czasami)
[php:1:c269fbc8fe]
$query = "
SELECT *
CASE (czas_1 > czas_2)
THEN czas_1 as czas_min
ELSE czas_2 as czas_min
END
FROM zgloszenia_sss
WHERE klasa='MINI' AND (czas_1 != '' OR czas_2 != '')
ORDER BY czas_min
";
[/php:1:c269fbc8fe]

Nie dziala to gdyz przy fetch_array wyskakuje mi error sad.gif

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in c:apachehtdocsmwyniki.php on line 14

Linijka 14 jest postaci
[php:1:c269fbc8fe]
while ($row = mysql_fetch_array($do))
[/php:1:c269fbc8fe]

Wczesniej jest query.
DeyV
troszkę się nie zrozumieliśmy.
1. oczywiście błąd jest w zapytaniu, na przyszłość, przynajmniej na czes testów pisz $wynik = mysql_query($pyt) or die ("bład zapytania: $pyt");

2. zapytanie ma wyglądać tak: (u mnie działa)
Kod
SELECT `nazwa`,

  (  CASE  WHEN (  `czas_1`  >  `czas_2`  )

  THEN  `czas_1`  

  ELSE  `czas_2`  

  END  

  ) AS czas

FROM `tabela`

3. as zawsze stawia sie po wyrażeniu, nie w środku. Tu wyrażenie zaczyna się od case, kończy na end.
4. Gdy natrafiasz na taki problem, to zazwyczaj okazuje sie, że najlepszym rozwiażaniem jest zmiana budowy bazy danych. Wszystko mozna uprościć...
Yasieq
Uratowales mnie, dzieki wielkie! smile.gif
______________________________________________
post zmoderowany - prosze ostroznie z wulgaryzmami

pozdrawiam Itsme
______________________________________________
Yasieq
Niestety, wraz z rozwojem bazy, problem powrocil ze zdwojona sila sad.gif

Obecnie kolumn z czasem mam az 10... a moje zadanie polega na wybraniu 10 najnizszych czasow ze wszystkich 10 kolumn... robienie to poprzez warunki chyba nie ma sensu. Ktos ma jakis pomysl na w miare proste zapytanie?
DeyV
I tu objawia sie wartość wykłądów na temat projektowania baz danych.
Rozwiązanie, które próbujesz zmontować jest niestety wysoce niewydajne, i to zarówno pod względem budowania interfejsu, jak i pod względem prędkości działania.
Jak więc to zrobić lepiej?
Dzielisz dane na 2 tablice:
1. users id | nazwa | data | ...
2. wyniki id | user_id | wynik

A zapytanie?
Kod
SELECT

    `users`.`id`,

    `users`.`nazwa`,

     MIN(`wyniki`.`wynik`)  as `najmniejsz_wynik`

FROM`users`

LEFT JOIN `wyniki` on (`users`.`id` = `wyniki`.`user_id `)

GROUP BY `users`.`id`

Co wiecej w ten sposób nic nie ogranicza Cię do określonej ilości danych. A mozę kiedyć będzie potrzeba ich jeszcze więcej niż 10?
Yasieq
Rozwiazalem to w ten sposob, ze wszystkie czasy z pol czas_1 do czas_10 wrzucam do nowej tabeli, wraz z id... i teraz selectowanie 10 najlepszych dziala bez problemu, ale sad.gif :

- uzytkownik o danym id ma wpisane 5 czasow, a ja chce pobrac dla kazdego tylko po jednym, najnizszym czasie. Macie pomysl jak to zrobic?
DeyV
Ktoś nie czyta dokładnie odpowiedzi...
Najmniejszy wynik dla określonego usera:
Kod
SELECT

    `users`.`id`,

    `users`.`nazwa`,

     MIN(`wyniki`.`wynik`)  as `najmniejsz_wynik`

FROM`users`

LEFT JOIN `wyniki` on (`users`.`id` = `wyniki`.`user_id `)

WHERE  `users`.`id` = '$id_wybranego_usera'

Najmniejsze wyniki wszystkich w poście powyżej...
Yasieq
Niestety nie poradzilem sobie z problemem tak jak mowil DeyV i w miedzyczasie wyszla mi potrzeba sklecenia nowej tabeli, w ktorej wrzucam wszystkie czasy wszystkich zawodnikow.

Wyglada to np tak:

Kod
id | czas

----------

1    12.34

1    11.34

1    10.34

2    13.14

2    14.14

2    15.14



and so on...

Potrzebuje wybrac dla kazdego id najmniejszy osiagniety czas, czyli:



id | czas

----------

1    10.34

2    13.14



and so on...
maggot
Kod
select min(czas) from tabela group by id
Yasieq
Nie dziala - tzn dziala, ale wcale nie pobiera najmniejszego czasu. Konkretnie zapytanie jest takie:
Kod
SELECT MIN( czas ) , numer, nazwisko FROM  `wyniki_all_sss`  GROUP  BY id ORDER  BY czas
DeyV
Znowu masz źle zaprojektowaną bazę sad.gif
Te 2 tabele powinny wygądać mniej więcej tak:
User: id | imie | ...
Czasy: id | user_id | time

Zapytanie mniej-więcej:
Kod
SELECT user.id, user.imie, min(`czasy.time`)

FROM`tabela`

LEFT JOIN  `czasy` on ( user.id = czasy.user_id)

GROUP BY  user.id
Yasieq
Problem rozwiazalo takie zapytanie: (biggrin.gif:D:D)

Kod
SELECT MIN( czas ) AS czas, id, numer, samochod, klasa

FROM wyniki_all_sss

WHERE czas != ''

GROUP BY id

ORDER BY czas

LIMIT 0 , 10
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.