[MySQL] Problem mit SELECT

Seite 1 von 1 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/mysql_problem_mit_select_107253/page_1 - zur Vollversion wechseln!


vossi schrieb am 17.02.2004 um 02:17

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 schrieb am 17.02.2004 um 02:51

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 schrieb am 17.02.2004 um 03:35

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 schrieb am 17.02.2004 um 07:46

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 schrieb am 17.02.2004 um 13:15

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 schrieb am 17.02.2004 um 13:21

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 schrieb am 17.02.2004 um 13:26

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 schrieb am 17.02.2004 um 13:31

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 schrieb am 17.02.2004 um 13:44

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 schrieb am 17.02.2004 um 13:45

das letzte was passiert ist für jede ID (Maschine)


gue schrieb am 17.02.2004 um 22:04

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).




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025