dirmhirn
Goto Top

LEFT JOIN mit 3 Tabellen - MySQL 5.1

Hi!

Erstelle gerade eine Datenbank für interne Produkttests.

Man kann Produkte (Sitze) anlegen und mit verschiedenen Testkriterien/Parametern verknüpfen. Nach dem Test kann man die Ergebbnisse in die Datenbank eintragen.

3 Tabellen:
own
- ID_parameter
- ID_seat

parameter
- ID_parameter
- description
- ...

test
- ID_parameter
- ID_seat
- ID_vehicle
- test_result
- ...

zu jedem ID_seat gibt es genau einen Eintrag pro ID_parameter in `own`
zu jeder ID_seat & ID_vehicle kombi gibt es maximal einen eintrag mit ID_parameter in `test`

jetzt kann es aber vorkommen, dass in die Own-Tabelle neue Verknüpfungen eingetragen werden. Mein Ziel ist es nun alle vorhandenen test_results und alle neu verknüpften Parameter für eine bestimmte ID_Seat & Vehicle.

eigentlich dachte es geht mit:
SELECT * 
FROM (parameter LEFT JOIN own USING(ID_parameter)) LEFT JOIN test USING(ID_parameter)
WHERE (own.ID_seat = xx) or (test.ID_seat = xx AND test.ID_vehicle = yy)
das wird aber ein CROSS JOIN oder so...

Folgende Lösung funktioniert:
SELECT ID_parameter, ID_seat, description, `type`, max(test_result)
FROM (
    (SELECT parameter.ID_parameter, ID_seat, description, `type`, NULL AS test_result
    	FROM parameter LEFT JOIN own USING (ID_parameter)
    	WHERE ID_seat = xx)
    UNION
    (SELECT parameter.ID_parameter, ID_seat, description, `type`, test_result
    	FROM parameter LEFT JOIN test USING (ID_parameter)
    	WHERE ID_seat = xx AND ID_vehicle = yy)
    ) AS derived_tab
GROUP BY ID_parameter

gibt es eine effizientere Lösung?

es ist eine MySQL 5.1 Datenbank.

sg Dirm

Content-Key: 174292

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

Ausgedruckt am: 28.03.2024 um 09:03 Uhr

Mitglied: MadMax
MadMax 10.10.2011 um 13:29:04 Uhr
Goto Top
Hallo Dirm,

da in der own-Tabelle ja alle Verknüpfungen ID_parameter/ID_seat drin sind, brauchst Du zur own-Tabelle kein left join. Die Tabelle test muß dann nur noch über ID_seat mit own verknüpft werden und Du hast keinen cross join mehr:

SELECT	* 
FROM	parameter
	JOIN own on parameter.ID_parameter = own.ID_parameter
	LEFT JOIN test on own.ID_parameter = test.ID_parameter and own.ID_seat = test.ID_seat and test.ID_vehicle = yy
WHERE	own.ID_seat = xx

Gruß, Mad Max
Mitglied: Dirmhirn
Dirmhirn 11.10.2011 um 18:14:28 Uhr
Goto Top
Hi Mad Max,

Danke für den Input - werde den Code umbauen.

Sg Dirm