"We are back" « oc.at

[MySQL] Problem mit SELECT

vossi 17.02.2004 - 02:17 1086 10
Posts

vossi

been there, done that
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 1436
Also ich hab ein SELECT das aussieht wie folgendes:

SELECT *
FROM `allystat` as als, `allymembers` as alm
WHERE als.id = alm.id AND als.datum=NOW();

Also ich will zu jeder ID mit dem heutigen Datum alles erfahren.
Mein Prob ist aber das nicht immer Eintragungen von heute bestehen und daher will ich den Datensatz von jeder ID aber jeweils mit dem höchst möglichen Datum welches von ID zu ID unterschiedlich ist.

Leider habe ich überhaupt keine Ahnung wie ich das in MySQL realisieren soll.

Ich hoffe jemand kann mir helfen und tia

vossi

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25536
Zitat
Mein Prob ist aber das nicht immer Eintragungen von heute bestehen und daher will ich den Datensatz von jeder ID aber jeweils mit dem höchst möglichen Datum welches von ID zu ID unterschiedlich ist
entweder ich versteh den satz gar nicht (ziemlich wahrscheinlich :p) oder du meinst: ORDER BY als.datum DESC LIMIT 1

vossi

been there, done that
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 1436
du verstehstn satz nicht bzw. ich kann mich nimmer artikuliern :D

eine Tabelle hat IDs und Namen
die andre Tabelle hat FremdKey ID, datum und ein Zahlenwert
also ne History sozusagen

Ich will jetzt zu jeder ID aus der ersten Tabelle den jeweils aktuellsten wert aus der zweiten Tabelle welcher aber NICHT vom heutigen Datum sein muss

The Red Guy

Untitled
Avatar
Registered: Jul 2001
Location: Transdanubia
Posts: 3121
SELECT * FROM allystat,allymembers WHERE allystat.ID = allymembers.ID AND allystat.datum <> NOW() ORDER BY allystat.datum DESC LIMIT 1

Zumindest es das, was du gepostet hast. :)

vossi

been there, done that
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 1436
durch ein Order bekomm ichs nur anders sortiert und muss dann wieder die gewünschten einträge selber rausfinden bzw. die andren wegfallen lassen.

und das Datum kann = NOW() auch sein .. aber nicht grösser

stells dir so vor .. du hast 10 maschinen zu denen du täglich statistiken einträgst aber am Mittwoch arbeitet keiner mit der 9ten Maschin also trägst dort nix ein

Donnerstag früh will ma jetzt den neuesten Stand aller Maschinen wissen der bei allen bis auf bei der 9er der gestrige is .. aber das weiss das dumme SQL nicht und dadurch kommt auch GAR NIX zur 9er maschine weils ja per
allystat.ID = allymembers.ID gejoined wurd

Verdammt im Beispiel suchn bin ich nicht der beste :D

Hakke

Little Overclocker
Avatar
Registered: Jul 2003
Location: München
Posts: 79
Also entweder du hantierst mit berechnungn innerhalb des SQL States (habs irgendwo in meiner Onlineanzeige..), sodass du vom heutigen Tag X Tage abziehst, oder du befüllst laut deinem Beispiel die Tab/Spalte/WWI von Rechner neun mit nullen und aktuellen Datum, wenn nicht daran gearbeitet wurde. Dann wäre bei allen 10 das Datrum von gestern, aber Maschine neun spuckt nix aus ausser nullen. Oder du kopierst die Einträge vom Vortag mit einem Flag dass diese Daten anderen Datums sind.

LG,Flo

atrox

in fairy dust... I trust!
Avatar
Registered: Sep 2002
Location: HTTP/1.1 404
Posts: 2782
hmmm.. und wenn man mit 'group by id' und 'max(datum)' herausfindet was das jeweilige letzte datum ist, könnte man das benutzen um den entsprechenden eintrag zu suchen

da man aber mit dem ergebnis einer aggregat-funktion joinen möchte, bräuchte man subselects oder muß es auf mehrere statements splitten.

vossi

been there, done that
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 1436
hakke: nein dummy werte einfügen ist nicht der schöne weg und vom datum irgendwas abziehn bringts auch nicht weil ich ja NIE weiss wieviele tage ein sys irgendwo nicht arbeitet

atrox: das problem liegt am "subselect" das es ja iirc im MySQL nicht gibt .. sonst wärs gelöst .. einen andren schönen weg über 1ne SQL abfrage gibt es also scheinbar nicht

hctuB

Bloody Newbie
Avatar
Registered: Feb 2002
Location: Pampa LL
Posts: 2410
Möchtest du nur das letzte haben was passiert ist, oder alles innerhalb der letzten 24h bzw wenn nichts passiert in den letzten 24h den letzten Datensatz?

Hoffe es ist verständlich

vossi

been there, done that
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 1436
das letzte was passiert ist für jede ID (Maschine)

gue

Addicted
Avatar
Registered: Feb 2003
Location: Linz
Posts: 400
Das selbe Problem gibt es ja bei Foren, wenn du es so modelliert hast, dass die Forenposts als Fremdschlüssel die ThreadID haben und du die letzten Antworten jedes Threads herauspicken willst (so wie hier im Forum).

Ich habe lange mit einem Statement herumprobiert, bis ich es dann aufgegeben habe und es auf 2 Statements aufgesplittet habe.
Bei dir könnte das evtl. ca. so ausschauen:

Code:
SELECT *, MAX(all.date) as highestdate
FROM allystat als JOIN allymembers all
ON als.id=all.id
GROUP BY all.id
ORDER BY all.date DESC;
und dann musst du für jede Zeile, die du erhälst, wiederum das rauslesen, was du speziell willst. In $id steht die ID der jeweiligen Zeile und in $highestdate das, was du im ersten Query für die jeweilige Zeile in highestdate herausbekommen hast.
Code:
SELECT DISTINCT all.*
FROM allymembers all
WHERE all.id=$id AND all.date=$highestdate;

(Ich hoffe das funktioniert alles so - habs nicht getestet :))

Alternativ könntest du auch die Datenbank umgestalten (und uU aus 3.NF bringen), indem du in allystat einen neuen Fremdschlüssel anlegst, der auf das neueste allymember "zeigt". (So gesehen in der Datenbankstruktur von yabbse).
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz