subselect verhindern?
am 09.06.2007 17:54:24 von Wolf Behrenhoff
Hallo,
kennt jemand einen einfachen Weg, folgendes Problem zu lösen:
Ich habe zwei Tabellen, in einer stehen Benutzer, in einer anderen wird
der aktuelle Status eines Benutzers festgehalten (und die vorherigen):
Benutzer
ID, Name, ...
Status
BenutzerID, Folge, Datum, Status
In der Status-Tabelle ist also für jeden Benutzer eine Folge gespeichert
mit Datum, d.h. am Anfang 1, dann 2 usw.
Der aktuelle Status ist nun der mit der entspr. BenutzerID und der
maximalen Folge.
Wie kann ich nun herausfinden, welchen Status ein Benutzer aktuell hat?
Ich suche also:
SELECT Name FROM Benutzer, Status WHERE ID=BenutzerID AND Folge='Maximal'.
Für das "Maximal" mache ich nun ein Subselect, d.h. (SELECT max(Folge)
FROM Status WHERE ID=BenutzerID)
Geht das irgendwie einfacher - ohne Subselect?
Wolf
Re: subselect verhindern?
am 09.06.2007 18:27:40 von Kai Ruhnau
Wolf Behrenhoff wrote:
> Ich habe zwei Tabellen, in einer stehen Benutzer, in einer anderen wird
> der aktuelle Status eines Benutzers festgehalten (und die vorherigen):
>
> Benutzer
> ID, Name, ...
>
> Status
> BenutzerID, Folge, Datum, Status
>
> In der Status-Tabelle ist also für jeden Benutzer eine Folge gespeichert
> mit Datum, d.h. am Anfang 1, dann 2 usw.
>
> Der aktuelle Status ist nun der mit der entspr. BenutzerID und der
> maximalen Folge.
>
> Wie kann ich nun herausfinden, welchen Status ein Benutzer aktuell hat?
>
> Ich suche also:
> SELECT Name FROM Benutzer, Status WHERE ID=BenutzerID AND Folge='Maximal'.
>
> Für das "Maximal" mache ich nun ein Subselect, d.h. (SELECT max(Folge)
> FROM Status WHERE ID=BenutzerID)
>
> Geht das irgendwie einfacher - ohne Subselect?
Ja, du suchst denjenigen Datensatz, zu dessen Folge-Wert es keinen
größeren gibt.
SELECT Benutzer.*, a.*
FROM Benutzer
INNER JOIN Status a ON a.BenutzerID=Benutzer.ID
LEFT JOIN Status b
ON b.BenutzerID=a.BenutzerID
AND b.Folge>a.Folge
WHERE b.Folge IS NULL
Grüße
Kai
--
This signature is left as an exercise for the reader.
Re: subselect verhindern?
am 09.06.2007 20:43:03 von Wolf Behrenhoff
Kai Ruhnau schrieb:
> Wolf Behrenhoff wrote:
>> Ich habe zwei Tabellen, in einer stehen Benutzer, in einer anderen wird
>> der aktuelle Status eines Benutzers festgehalten (und die vorherigen):
>>
> Ja, du suchst denjenigen Datensatz, zu dessen Folge-Wert es keinen
> größeren gibt.
>
> SELECT Benutzer.*, a.*
> FROM Benutzer
> INNER JOIN Status a ON a.BenutzerID=Benutzer.ID
> LEFT JOIN Status b
> ON b.BenutzerID=a.BenutzerID
> AND b.Folge>a.Folge
> WHERE b.Folge IS NULL
Vielen Dank!
Wolf