Funkcja MIN i MAX w mySQL

0

Witam,
próbowalem uzyc funkcji MIN lub MAX w mySQL poprzez
SELECT MAX (cena) id, nazwa FROM srodki group by MAX (cena), id, nazwa;
jednak zapytanie konczy sie bledem:
"#1064 - Something is wrong in your syntax obok '(cena), id, nazwa' w linii 1"

Probowalem rowniez:
SELECT *
FROM (

SELECT id, nazwa_srodka, cena
FROM srodki
ORDER BY id, nazwa_srodka, cena

)
GROUP BY nazwa_srodka
jednak ten sposob worniez konczy sie fiaskiem:
"#1064 - Something is wrong in your syntax obok 'SELECT id, nazwa_srodka, cena' w linii 4 "

moze ktos mial podobny problem? i podzieli sie sposobem jego rozwiazania?

0

SELECT MAX(COS_TAM) AS MAX,... FROM...

Co ma Delphi do tego ? [???]

0
maciejmt napisał(a)

SELECT MAX(COS_TAM) AS MAX,... FROM...

Co ma Delphi do tego ? [???]

Faktycznie moze Delphi ma niewiele wspolnego z tym o co pytalem, ale dalem to do tego dzialu poniewaz potrzebna jest mi wartosc MAX dla danych rekordow (wykorzystuje ja dalej w programie).

Ale mi wywala ze blad jest w MAX (jakby nie znal tej funkcji)

0

pokaz cale zapytanie jakie wprowadzasz, bo max co napisalem jest dobry.

0
maciejmt napisał(a)

pokaz cale zapytanie jakie wprowadzasz, bo max co napisalem jest dobry.

select MAX (cena) as MAX, id, nazwa FROM srodki;

0

Powiedz co próbujesz osiągnąć. Maksymalną cenę wszystkich środków? A może chcesz wiedzieć jJaki to środek posiada cenę, która jest ceną maksymalną dla wszystkich środków?

Bo owszem, można zrobić:

SELECT id, nazwa, MAX(cena) FROM srodki GROUP BY id, nazwa;

Ale to bez sensu, bo pary id-nazwa są zazwyczaj unikalne, więc MAX(cena) będzie się równał cenie.

Co do samego MAX(), MIN() i tak dalej - grupuje się po wszystkich kolumnach w SELECT, ale nie po funkcjach (bo to bez sensu), dlatego też

SELECT MAX (cena) id, nazwa FROM srodki group by MAX (cena), id, nazwa;

z twojego postu jest błędne.

Zresztą,

select MAX (cena) as MAX, id,  nazwa FROM srodki;

też jest błędne, bo nie ma grupowania. Oracle miał na to taki niezwykle niezrozumiały komunikat ;-)

0

Nie można używać jednocześnie kolumn zwykłych i funkcji grupujących, takich jak max, min count itp.

Rozwiązaniem jest podazpytanie:

SELECT `cena` AS `max`, `id`, `nazwa` FROM `srodki` WHERE `cena` = (SELECT Max(`cena`) FROM `srodki`);

Podzapytanie zwraca Ci maksymalną wartość ceny

(SELECT Max(`cena`) FROM `srodki`)

A wynik tegoż podajesz jako wartość ceny dla zwykłego zapytania. Gwarantuje Ci to prawidłowe wyświetlenie wierszy o maksymalnej cenie.

Edytka:
Ku przestrodze. Takie podzapytanie jak tutaj zwróci zawsze jedną wartość, ale jak byś miał podzapytanie które może zwrócić więcej niż jedną wartość to musisz wtedy zastosować porównanie poprzez IN:

SELECT `cena` AS `max`, `id`, `nazwa` FROM `srodki` WHERE `cena` IN (SELECT Max(`cena`) FROM `srodki`);

Tutaj akurat nie ma znaczenia czy zastosujesz "=" czy "IN", bo w obu przypadkach będzie działać prawidłowo. Ale nie dla każdego podzapytania będzie tak samo.

0
Ktos napisał(a)

Powiedz co próbujesz osiągnąć. Maksymalną cenę wszystkich środków? A może chcesz wiedzieć jJaki to środek posiada cenę, która jest ceną maksymalną dla wszystkich środków?

Bo owszem, można zrobić:

SELECT id, nazwa, MAX(cena) FROM srodki GROUP BY id, nazwa;

Ale to bez sensu, bo pary id-nazwa są zazwyczaj unikalne, więc MAX(cena) będzie się równał cenie.

Co do samego MAX(), MIN() i tak dalej - grupuje się po wszystkich kolumnach w SELECT, ale nie po funkcjach (bo to bez sensu), dlatego też

SELECT MAX (cena) id, nazwa FROM srodki group by MAX (cena), id, nazwa;

z twojego postu jest błędne.

Zresztą,

select MAX (cena) as MAX, id,  nazwa FROM srodki;

też jest błędne, bo nie ma grupowania. Oracle miał na to taki niezwykle niezrozumiały komunikat ;-)

Potrzebuje wyciagnac srodek (a dokladniej jego id) o maksymalnej cenie, bo przeciez moze byc sytuacja ze jest kilka srodkow o takiej samej nazwie, a ja potrzebuje wyciagnac id tego o najwiekszej

0

Cos takiego [???]

SELECT s.ID,s.Cena FROM Srodki s WHERE s.Cena=(SELECT MAX(Cena) FROM Srodki WHERE ID=s.ID)
0

Może też być sytuacja, że kilka środków ma największą cenę, a różne nazwy i id ;-)

0
maciejmt napisał(a)

Cos takiego [???]

SELECT s.ID,s.Cena FROM Srodki s WHERE s.Cena=(SELECT MAX(Cena) FROM Srodki WHERE ID=s.ID)

Niestety tez nie dziala, jak wykonuje:
SELECT s.ID, s.Cena
FROM Srodki s
WHERE s.Cena = (
SELECT MAX( Cena )
FROM Srodki
WHERE ID = s.ID )

to wywala blad "#1064 - Something is wrong in your syntax obok 'SELECT MAX(Cena)
FROM Srodki1 WHERE ID=s.ID)' w linii 5
"

0

No nie wiem, może masz inne nazwy tabel, pól. Bo to zapytanie jest poprawne składniowo.

0

Po kiego grzyba w podzapytaniu masz WHERE id=s.id. To zwróci Ci wszystkie wiersze, bo będzie maxa szukało lokalnie (w każdym wierszu osobno).

W pierwszym poście dałem Ci w 100% działające zapytanie (testowane). Więc nie rozumiem o co Ci jeszcze chodzi.

0
Loloki napisał(a)

Po kiego grzyba w podzapytaniu masz WHERE id=s.id. To zwróci Ci wszystkie wiersze, bo będzie maxa szukało lokalnie (w każdym wierszu osobno).

W pierwszym poście dałem Ci w 100% działające zapytanie (testowane). Więc nie rozumiem o co Ci jeszcze chodzi.

Wykonuje to zapytanie z Twojego pierwszego postu:
SELECT cena AS max,
id, nazwa
FROM srodki
WHERE
cena = (SELECT Max(cena) FROM 'srodki');
a w wyiku wywala mi blad
"#1064 - Something is wrong in your syntax obok 'SELECT Max(cena) FROM srodki1)' w linii 5 "
nie twierdze ze zapytanie jest zle skladniowo - moze mam cos nie tak z baza, ale nie wydaje mi sie.

Ps. To chyba nie ma znaczenie ze do mySQL uzywam Krasnala ?

0

Ps. To chyba nie ma znaczenie ze do mySQL uzywam Krasnala ?

Ma znaczenie. Krasnal nie był aktualizowany od wieków i możesz mieć archaicznego MySQL'a, który nie wspiera podzapytań (3.x).

Rozwiązanie: wywal to g**no, zaktualizuj oprogramowanie i spróbuj ponownie.

A jeśli z jakichś powodów nie możesz zainstalować nowszego MySQL'a, to pobranie najdroższego produktu można rozwiązać bez podzapytań sortując dane po cenie malejąco i biorąc pierwszy od góry wiersz.

0
Kicok napisał(a)

Ps. To chyba nie ma znaczenie ze do mySQL uzywam Krasnala ?

Ma znaczenie. Krasnal nie był aktualizowany od wieków i możesz mieć archaicznego MySQL'a, który nie wspiera podzapytań (3.x).

Rozwiązanie: wywal to g**no, zaktualizuj oprogramowanie i spróbuj ponownie.

A jeśli z jakichś powodów nie możesz zainstalować nowszego MySQL'a, to pobranie najdroższego produktu można rozwiązać bez podzapytań sortując dane po cenie malejąco i biorąc pierwszy od góry wiersz.

Pomysl dobry, problem w tym, ze wtedy nie moge pogrupowac danych po nazwie, a to jest mi potzebne, ale dzieki za podpowiedz

0

Zainstaluj sobie WAMP server:

  • MySQL 5.1.36
  • PHP 5.3.0
  • Apache 2.2.11
    Gra i trąbi ;)

A Krasnal to faktycznie prehistoria.

0
Loloki napisał(a)

Zainstaluj sobie WAMP server:

  • MySQL 5.1.36
  • PHP 5.3.0
  • Apache 2.2.11
    Gra i trąbi ;)

A Krasnal to faktycznie prehistoria.

Zainstalowalem WAMP server: ale teraz mam problem z polaczeniem do bazy, otwierajac http://localhost/phpmyadmin/, wyskakuje mi blad
"#1045 - Access denied for user 'root'@'localhost' (using password: NO) ". Mozesz podpowiedziec co trzeba zmienic w konfiguracji, zeby to chodzilo?

0

Nic, cała paczka działa z automatu, i jeszcze nigdy nie trafiło mi się, żeby ktoś miał z tym problemy.

Może podałeś hasło dla root'a. Możesz je zmienić znów na puste. Lub ustawić je w PhpMyAdmin, jak nie wiem, bo nie korzystam (jestem hardkorem, robię wszystko z konsoli MySQL'a ;) ).

1 użytkowników online, w tym zalogowanych: 0, gości: 1