s7mahess
Goto Top

MySQL Subquery und where is problem

Guten Tag,

ich habe folgendes Problem:

Wenn ich diese MySQL Syntax benutze kann ich nicht nach "zustand" oder "status" filtern, zB " where zustand = 'in Ordnung'

select
	geraete_id AS outer_id,
	hersteller,
	typ,
	seriennummer,
	ipei,
	(SELECT zustand FROM geraetehistory LEFT JOIN geraetezustand USING (geraetezustand_id) WHERE geraete_id = outer_id ORDER BY geraetezustand_id DESC LIMIT 1) AS zustand,
	(SELECT status FROM geraetehistory LEFT JOIN geraetestatus USING (geraetestatus_id) WHERE geraete_id = outer_id ORDER BY geraetestatus_id DESC LIMIT 1) AS status,
	garantiebis
from
	geraete
left join geraetetyp using (geraetetyp_id)

ausgabe soll sein:

id | hersteller | typ | snr | ipei | letzter eigentragener wert bei geraetezustand_id in geraetehistory | letzer eingetragner wert geraetestatus_id in geraetehistory | garantie

meine datenbankstruktur sieht wiefolgt aus:

b01c03a21501edf277647b42c058c259

Content-ID: 164095

Url: https://administrator.de/contentid/164095

Ausgedruckt am: 22.11.2024 um 13:11 Uhr

thaenhusen
thaenhusen 06.04.2011 um 18:10:33 Uhr
Goto Top
Moin.

Du kannst nicht mit dem Alias filter also

where zustand = 'in Ordnung'

müsste heißen:

where (SELECT zustand FROM geraetehistory LEFT JOIN geraetezustand USING (geraetezustand_id) WHERE geraete_id = outer_id ORDER BY geraetezustand_id DESC LIMIT 1) = "in Ordnung"

(ungetestet)

HTH
MK
Biber
Biber 06.04.2011 um 19:42:59 Uhr
Goto Top
Moin s7mahess,

abgesehen von thaenhusens Kommentar - wenn du diese abfrage gegen das oben abgebildete Datenmodell abfeuerst...
Was ist denn deine Erwartungshaltung?

Eine "geraete_id" wird doch ein-, zwei- oder achtmal gefunden in der Tabelle "geraete_history"
Und nur von da kommst du doch auf den "Zustand" und den "Status".

Wenn schon, dann darfst du doch aus der "geraete_history" nur die neuesten Datensätze, nur den Stand "heute" abziehen.

Oder welche Fragestellung willst du mit diesem Statement beantworten?

Grüße
Biber
s7mahess
s7mahess 07.04.2011 um 09:07:11 Uhr
Goto Top
Ok,

das obere statment soll mir eine Liste mit allen Geräten ausgeben in dieser Form:

| hersteller | typ | snr | ipei | letzter eigentragener wert bei geraetezustand_id in geraetehistory | letzer eingetragner wert geraetestatus_id in geraetehistory

in spalte "zustand" soll der aktuellste (letzte zustand) des geräts stehen. das wäre aus der tabelle "geraetehistory" der mit der höchsten "geraetehistory_id" where "geraete_id" = ..........................

face-smile

Da kam der Gedankenblitz:

select
	geraete_id,
	hersteller,
	typ,
	seriennummer,
	ipei,
	(SELECT zustand FROM geraetehistory LEFT JOIN geraetezustand USING (geraetezustand_id) WHERE geraetehistory.geraete_id = geraete.geraete_id ORDER BY geraetezustand_id DESC LIMIT 1) AS zustand,
	(SELECT status FROM geraetehistory LEFT JOIN geraetestatus USING (geraetestatus_id) WHERE geraetehistory.geraete_id = geraete.geraete_id ORDER BY geraetestatus_id DESC LIMIT 1) AS status,
	garantiebis
from
	geraete
left join geraetetyp using (geraetetyp_id)
WHERE
	(SELECT zustand FROM geraetehistory LEFT JOIN geraetezustand USING (geraetezustand_id) WHERE geraetehistory.geraete_id = geraete.geraete_id ORDER BY geraetezustand_id DESC LIMIT 1) LIKE 'in%'  
Biber
Biber 07.04.2011 um 10:56:54 Uhr
Goto Top
[OT]
@s7mahess
Hört sich echt performant an, das Statement..... face-wink

Grüße
Biber
[/OT]