Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> PHP/MySql - Wybranie najmniejszej liczby sposrod kilku pol
Yasieq
post
Post #1





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 23.03.2003
Skąd: Radom

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


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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 15)
DeyV
post
Post #2





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




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ć
Go to the top of the page
+Quote Post
Yasieq
post
Post #3





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 23.03.2003
Skąd: Radom

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


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
Go to the top of the page
+Quote Post
DeyV
post
Post #4





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




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
Go to the top of the page
+Quote Post
Yasieq
post
Post #5





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 23.03.2003
Skąd: Radom

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


Nie dziala (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/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.
Go to the top of the page
+Quote Post
DeyV
post
Post #6





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




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ć...
Go to the top of the page
+Quote Post
Yasieq
post
Post #7





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 23.03.2003
Skąd: Radom

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


Uratowales mnie, dzieki wielkie! (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
______________________________________________
post zmoderowany - prosze ostroznie z wulgaryzmami

pozdrawiam Itsme
______________________________________________
Go to the top of the page
+Quote Post
Yasieq
post
Post #8





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 23.03.2003
Skąd: Radom

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


Niestety, wraz z rozwojem bazy, problem powrocil ze zdwojona sila (IMG:http://forum.php.pl/style_emoticons/default/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?
Go to the top of the page
+Quote Post
DeyV
post
Post #9





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




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?
Go to the top of the page
+Quote Post
Yasieq
post
Post #10





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 23.03.2003
Skąd: Radom

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


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 (IMG:http://forum.php.pl/style_emoticons/default/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?
Go to the top of the page
+Quote Post
DeyV
post
Post #11





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




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...
Go to the top of the page
+Quote Post
Yasieq
post
Post #12





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 23.03.2003
Skąd: Radom

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


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...
Go to the top of the page
+Quote Post
maggot
post
Post #13





Grupa: Zarejestrowani
Postów: 77
Pomógł: 0
Dołączył: 7.05.2002
Skąd: Sz-n/Wroc/Wawa

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


Kod
select min(czas) from tabela group by id
Go to the top of the page
+Quote Post
Yasieq
post
Post #14





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 23.03.2003
Skąd: Radom

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


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
Go to the top of the page
+Quote Post
DeyV
post
Post #15





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




Znowu masz źle zaprojektowaną bazę (IMG:http://forum.php.pl/style_emoticons/default/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
Go to the top of the page
+Quote Post
Yasieq
post
Post #16





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 23.03.2003
Skąd: Radom

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


Problem rozwiazalo takie zapytanie: ((IMG:http://forum.php.pl/style_emoticons/default/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
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: 22.08.2025 - 12:37