"We are back" « oc.at

mysql: max() von mehreren spalten

kleinerChemiker 13.12.2004 - 18:09 4240 7
Posts

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4303
ich habe mehrere spalten, a, b, c, usw. und eine spalte für die zeit. nun würde ich gerne von jeder spalte den max()-wert mit zugehörigem zeit-wert abfragen. ist das in einem query möglich? oder muß ich für jede spalte eine eigene abfrage machen?

beim schreiben ist mir jetzt eine idee gekömmen, könnte sie funzen?
SELECT a, b, c, zeit FROM tabelle WHERE max(a) OR max(b) OR max(c) ORDER BY a, b, c

tia

MIK

DKCH

Administrator
...
Registered: Aug 2002
Location: #
Posts: 3301
hast du's mit HAVING schon probiert?

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4303
having ist ja nix anderes als where, nur daß es nicht optimiert wird. und erst ganz am schluß einzusetzen.

edit: die idee funzt nicht. kommt folgende fehlermeldung:

Falsche Verwendung der GROUP-Funktion
Bearbeitet von kleinerChemiker am 13.12.2004, 18:23

gerhardtt

Big d00d
Registered: Aug 2000
Location:
Posts: 333
dh. du möchest alle zeilen haben die einen(oder auch mehrere) maxwert(e) beherbergen?

@having: having ohne group by wird nicht funktionieren... having ist zwar wie eine where bedingung aber nur auf zuvor gruppierte elemente.

solltest du eine subselectdb haben (neueste mysql sollten das packen)
dann:

select a,b,c
from table
where a= (select max(a) from table) or b=(select max(b) from table)....

grüsse
Bearbeitet von gerhardtt am 13.12.2004, 18:51

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4303
ich möchte den max-wert jeder einzelnen spalte (nicht zeile) haben und den jeweils zugehörigen timestamp (ist in einer weiteren spalte gespeichert)

rettich

Legend
waffle, waffle!
Avatar
Registered: Jan 2004
Location: wien
Posts: 794
Zitat von kleinerChemiker
oder muß ich für jede spalte eine eigene abfrage machen?

naja.
du kannst mit einem union alle ergebnisse zu einem set zusammen, dann hast halt eine neue tabelle mit pro gelesener spalte eine zeile mit drei spalten

sieht dann so aus

"spalte" - "maxwert" - "zeit"
a - 25 - 25.12
b - 17 - 17.08
c - 18 - 12.03
usw

(query dazu wäre ca:
select "a" as "spalte", max(f_a) as maxwert, f_time as "zeit" from table
UNION
select "b" as "spalte", max(f_b) as maxwert, f_time as "zeit" from table
...)

aber ob das sinn macht?

wie stellst dir denn das ergebnis vor? wie soll das ausschauen, so dass es dir was bringt?

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4303
naja, macht wohl nicht wirklich sinn. wollte versuchen querys zu sparen um das ganze eine spur schneller und resourcenfreundlicher zu machen.

hätte dann halt ne zeile für jeden maxwert gerne gehabt. aber egal, mach ich halt eigene querys.

thx

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4303
hrmpf
neues problem. mein query sieht nun so aus:

SELECT max(clients) AS clients, zeit FROM sstatus ORDER BY zeit DESC LIMIT 1

allerdings spuckt mysql dabei folgenden fehler aus:

Das Vermischen von GROUP Spalten (MIN(),MAX(),COUNT()...) mit Nicht-GROUP Spalten ist nicht erlaubt, sofern keine GROUP BY Klausel vorhanden ist.

ein einfügen von 'GROUP BY zeit' läßt das ganze funktionieren, aber nicht mit dem gewünschten ziel. nun erhalte ich nicht den maximalwert aller spalten sondern scheinbar den letzten eintrag (= der mit dem höchsten timestamp)

MIK

edit:
man bin ich blöd. hab viel zu kompliziert gedacht. ein einfaches 'SELECT clients, zeit FROM sstatus ORDER BY clients DESC, zeit DESC LIMIT 1' tuts auch :bash:
Bearbeitet von kleinerChemiker am 13.12.2004, 19:53
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz