subselect verhindern?

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