[MySQL] Problem mit SELECT
vossi 17.02.2004 - 02:17 1086 10
vossi
been there, done that
|
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
AdministratorLegends never die
|
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](/images/smilies/tongue.gif) ) oder du meinst: ORDER BY als.datum DESC LIMIT 1
|
vossi
been there, done that
|
du verstehstn satz nicht bzw. ich kann mich nimmer artikuliern ![:D](/images/smilies/biggrin.gif) 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
|
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
|
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
|
Hakke
Little Overclocker
|
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!
|
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
|
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
|
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
|
das letzte was passiert ist für jede ID (Maschine)
|
gue
Addicted
|
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: 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. SELECT DISTINCT all.*
FROM allymembers all
WHERE all.id=$id AND all.date=$highestdate;
(Ich hoffe das funktioniert alles so - habs nicht getestet ![:)](/images/smilies/smile.gif) ) 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).
|