Den vorhandenen Wert aus 4 Tabellen und einer Bezugstabelle abrufen (MySQL)


tvtotal

Erfahrenes Mitglied
Hallo, ich habe 5 Tabellen und möchte folgendes abrufen:

Es ist immer nur 1 Wert in einer der article-Tabellen vorhanden, der ausgegeben werden soll.

Tab0: def
defkey oid

Tab1: 1_2article
aid value

Tab1: 2_2article
aid value

Tab1: 3_2article
aid value

Tab1: 4_2article
aid value


SQL:
select distinct coalesce(cmita.value, cmea.value, cmiaa.value, cmca.value) from def cmida
LEFT JOIN 1_2article cmita ON cmida.defkey = cmita.aid
LEFT JOIN 2_2article cmea ON cmida.defkey = cmea.aid
LEFT JOIN 3_2article cmiaa ON cmida.defkey = cmiaa.aid
LEFT JOIN 4_2article cmca ON  cmida.defkey = cmca.aid

where cmida.oid = 'XXXX' and cmita.oid = 'YYYYY' and cmea.oid = 'YYYYY' and cmiaa.oid = 'YYYYY' and cmca.oid = 'YYYYY';
Gebe ich statt "and" "or" ein, werden Werte ausgegeben, allerdings viel zu viele.
 

Yaslaw

n/a
Moderator
öhm - was willst du?

Verstehe ich richtig, du hast 5 Identische Tabellen? Warum? Sowas macht man nicht.
Und wenn doch, dann macht man eine UNION Abfrage als Indexliste um herauszufinden was wo ist.

SQL:
select aid, value, 'tab0' as source from tab0
union select aid, value, 'tab1' as source from tab1
union select aid, value, 'tab2' as source from tab2
....
Mit der kannst du dann weiter arbeiten als ob du nur eine Tabelle hättest (was wahrscheinlich sauberer wäre)
 

tvtotal

Erfahrenes Mitglied
Hallo und nein, die Tabellen sind nicht identisch. Nur die Spaltennamen zum Abruf der Werte sind in diesem Fall gleich.
Für einen Artikel sind in den 4 verschiedenen Tabellen Werte abgelegt. Pro defkey (cmida.oid = 'XXXX') gibt es mindestens 1 oder maximal 4 Werte. Nur diese 1-4 sollen ausgegeben werden. Danke.
 

Zvoni

Erfahrenes Mitglied
Hast du mal versucht die WHERE-Bedingungen von tab1-4 in die jeweilige ON-klausel zu schieben?
SQL:
select distinct coalesce(cmita.value, cmea.value, cmiaa.value, cmca.value) from def cmida
LEFT JOIN 1_2article cmita ON cmida.defkey = cmita.aid AND cmita.oid = 'YYYYY'
LEFT JOIN 2_2article cmea ON cmida.defkey = cmea.aid and cmea.oid = 'YYYYY'
LEFT JOIN 3_2article cmiaa ON cmida.defkey = cmiaa.aid and cmiaa.oid = 'YYYYY'
LEFT JOIN 4_2article cmca ON  cmida.defkey = cmca.aid and cmca.oid = 'YYYYY'

where cmida.oid = 'XXXX';
Ausserdem bin ich mir nicht sicher was du mit COALESCE erreichen willst. COALESCE gibt bekanntlich den ersten nicht-Null-Wert aus der Liste zurück
 

tvtotal

Erfahrenes Mitglied
Hallo. Das mit coalesce ist "für mich" korrekt. Es gibt immer nur einen Wert pro Abfrage, der in allen 4 Tabellen vorhanden sein kann. Das andere probiere ich heute Abend aus. Danke erstmal.