Mysql - abhängige Joins
Hallo Forum,
ich möchte folgende Aufgabe lösen:
Produkten werden Produkttexte (sprachabhängig) mitgegeben. Jetzt möchte ich aber die Produkt-Texte noch zusätzlich in Varianten einteilen.
Dabei gilt: Jedes Produkt (IMMER) in PRODUKTTAB hat einen DatenSatz in PRODUKTTEXTTAB mit variante_id=0. Jetzt kann es aber vorkommen, dass für manche Produkte in PRODUKTTAB neben dem Datensatz in PRODUKTTEXTTAB mit variante_id=0 auch noch ein Weiterer mit variante_id=2 vorhanden ist. Es stehen dann also 2 Datensätze (hinsichtlich Variante) in PRODUKTTEXTTAB pro Datensatz von PRODUKTTAB zur Verfügung. Wenn eine Variante größer 0 (z.B. 2) zur Verfügung steht, dann soll diese verwendet werden. ... ansonsten die Variante 0.
ich habe (als Beispiel) ein Produkt-Tabelle:
PRODUKTTAB mit den Spalten
id_produkt
hersteller_id
und dazu gibt es eine Produkt-Texte-Tabelle mit "Varianten":
PRODUKTTEXTTAB mit den Spalten
id_produkttext
produkt_id
sprach_id
variante_id
produkt_bezeichnung
produkt_beschreibung
OHNE VARIANTEN habe ich da ein einfaches Statement (sprach_id wird von aussen bestimmt)
Code:
select * PRODUKTTAB
left join PRODUKTTEXTTAB on PRODUKTTEXTTAB.produkt_id = PRODUKTTAB.id_produkt and PRODUKTTEXTTAB.sprach_id = $var_irgendeinesprach_id
group by PRODUKTTAB.produkt
... jetzt soll es aber mehrere Textvarianten geben. z.B. die Varianten 0 und 2. Wobei die Variante IMMER Texte enthält und die restlichen Varianten eventuell keine.
Code:
select * PRODUKTTAB
left join PRODUKTTEXTTAB on PRODUKTTEXTTAB.produkt_id = PRODUKTTAB.id_produkt and PRODUKTTEXTTAB.sprach_id = $var_irgendeinesprach_id and PRODUKTTEXTTAB.variante_id = $var_variante_id
group by PRODUKTTAB.produkt
Wie bekomme ich es hin, dass, wenn es z.B. für die Text-Variante 2 ($var_variante_id=2) keinen Eintrag gibt, das Statement auf den Eintrag mit der Variante 0 ($var_variante_id=0) zurückgreift?
Ich weiss, dass es mit CASE irgendwie geht ... aber ich habe keine ahnung, wie ich das mit JOIN "mischen"/verwenden kann.
Vielen Dank für einen Ansatz.
ich möchte folgende Aufgabe lösen:
Produkten werden Produkttexte (sprachabhängig) mitgegeben. Jetzt möchte ich aber die Produkt-Texte noch zusätzlich in Varianten einteilen.
Dabei gilt: Jedes Produkt (IMMER) in PRODUKTTAB hat einen DatenSatz in PRODUKTTEXTTAB mit variante_id=0. Jetzt kann es aber vorkommen, dass für manche Produkte in PRODUKTTAB neben dem Datensatz in PRODUKTTEXTTAB mit variante_id=0 auch noch ein Weiterer mit variante_id=2 vorhanden ist. Es stehen dann also 2 Datensätze (hinsichtlich Variante) in PRODUKTTEXTTAB pro Datensatz von PRODUKTTAB zur Verfügung. Wenn eine Variante größer 0 (z.B. 2) zur Verfügung steht, dann soll diese verwendet werden. ... ansonsten die Variante 0.
ich habe (als Beispiel) ein Produkt-Tabelle:
PRODUKTTAB mit den Spalten
id_produkt
hersteller_id
und dazu gibt es eine Produkt-Texte-Tabelle mit "Varianten":
PRODUKTTEXTTAB mit den Spalten
id_produkttext
produkt_id
sprach_id
variante_id
produkt_bezeichnung
produkt_beschreibung
OHNE VARIANTEN habe ich da ein einfaches Statement (sprach_id wird von aussen bestimmt)
Code:
select * PRODUKTTAB
left join PRODUKTTEXTTAB on PRODUKTTEXTTAB.produkt_id = PRODUKTTAB.id_produkt and PRODUKTTEXTTAB.sprach_id = $var_irgendeinesprach_id
group by PRODUKTTAB.produkt
... jetzt soll es aber mehrere Textvarianten geben. z.B. die Varianten 0 und 2. Wobei die Variante IMMER Texte enthält und die restlichen Varianten eventuell keine.
Code:
select * PRODUKTTAB
left join PRODUKTTEXTTAB on PRODUKTTEXTTAB.produkt_id = PRODUKTTAB.id_produkt and PRODUKTTEXTTAB.sprach_id = $var_irgendeinesprach_id and PRODUKTTEXTTAB.variante_id = $var_variante_id
group by PRODUKTTAB.produkt
Wie bekomme ich es hin, dass, wenn es z.B. für die Text-Variante 2 ($var_variante_id=2) keinen Eintrag gibt, das Statement auf den Eintrag mit der Variante 0 ($var_variante_id=0) zurückgreift?
Ich weiss, dass es mit CASE irgendwie geht ... aber ich habe keine ahnung, wie ich das mit JOIN "mischen"/verwenden kann.
Vielen Dank für einen Ansatz.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 152954
Url: https://administrator.de/forum/mysql-abhaengige-joins-152954.html
Ausgedruckt am: 23.12.2024 um 16:12 Uhr
5 Kommentare
Neuester Kommentar
Hi,
verstehe ich das richtig?! Du willst aus PRODUKTTAB die id_produkt und aus der PRODUKTTEXTTAB den id_produkttext mit der höchsten variante_id...
select
PRODUKTTAB.id_produkt
max(PRODUKTTEXTTAB.variante_id)
from
PRODUKTTAB left join PRODUKTTEXTTAB on PRODUKTTAB .id_produkt = PRODUKTTEXTTAB.produkt_id
group by PRODUKTTAB.id_produkt
Oder willst du die PRODUKTTEXTTAB.variante_id mit einem Parameterwert vorbelegen und diesen anzeigen -> bzw. wenn nicht vorhanden den nächst kleineren???
Gruß Netzfetzer
verstehe ich das richtig?! Du willst aus PRODUKTTAB die id_produkt und aus der PRODUKTTEXTTAB den id_produkttext mit der höchsten variante_id...
select
PRODUKTTAB.id_produkt
max(PRODUKTTEXTTAB.variante_id)
from
PRODUKTTAB left join PRODUKTTEXTTAB on PRODUKTTAB .id_produkt = PRODUKTTEXTTAB.produkt_id
group by PRODUKTTAB.id_produkt
Oder willst du die PRODUKTTEXTTAB.variante_id mit einem Parameterwert vorbelegen und diesen anzeigen -> bzw. wenn nicht vorhanden den nächst kleineren???
Gruß Netzfetzer
select
PRODUKTTAB.id_produkt
max(PRODUKTTEXTTAB.variante_id)
from
PRODUKTTAB left join PRODUKTTEXTTAB on PRODUKTTAB .id_produkt = PRODUKTTEXTTAB.produkt_id
where
PRODUKTTEXTTAB.variante_id <= $var_variante_id
group by PRODUKTTAB.id_produkt
Im Prinzip will ich mit dem Statement erreichen, dass SQL alle Varianten ausliest, die kleiner/gleich deiner Suchbedingung sind (zB variante = 2) und davon den maximalen Wert nimmt...
Also deine eingabe ist du willst die Variante 2:
- gibt es die Var. 0 und die Var.2 sollte das Statement 2 liefern, da dies der max-Wert ist
- gibt es nur die Var. 0 ist der max-Wert demenstprechend 0
Hilft dir das schon weiter?
Gruß Netzfetzer
PRODUKTTAB.id_produkt
max(PRODUKTTEXTTAB.variante_id)
from
PRODUKTTAB left join PRODUKTTEXTTAB on PRODUKTTAB .id_produkt = PRODUKTTEXTTAB.produkt_id
where
PRODUKTTEXTTAB.variante_id <= $var_variante_id
group by PRODUKTTAB.id_produkt
Im Prinzip will ich mit dem Statement erreichen, dass SQL alle Varianten ausliest, die kleiner/gleich deiner Suchbedingung sind (zB variante = 2) und davon den maximalen Wert nimmt...
Also deine eingabe ist du willst die Variante 2:
- gibt es die Var. 0 und die Var.2 sollte das Statement 2 liefern, da dies der max-Wert ist
- gibt es nur die Var. 0 ist der max-Wert demenstprechend 0
Hilft dir das schon weiter?
Gruß Netzfetzer
select
PRODUKTTAB.id_produkt,
max(PRODUKTTEXTTAB.variante_id),
PRODUKTTEXTTAB.bezeichnung
from
PRODUKTTAB left join PRODUKTTEXTTAB on PRODUKTTAB .id_produkt = PRODUKTTEXTTAB.produkt_id
where
PRODUKTTEXTTAB.variante_id <= $var_variante_id and
PRODUKTTEXTTAB.bezeichnung is not null
group by PRODUKTTAB.id_produkt, PRODUKTTEXTTAB.bezeichnung
also als einschränkung die gesuchte variante <= deiner suchbedingung ist aber gleichzeitig auch die bezeichnung gefüllt ist...
Gruß Netzfetzer
PRODUKTTAB.id_produkt,
max(PRODUKTTEXTTAB.variante_id),
PRODUKTTEXTTAB.bezeichnung
from
PRODUKTTAB left join PRODUKTTEXTTAB on PRODUKTTAB .id_produkt = PRODUKTTEXTTAB.produkt_id
where
PRODUKTTEXTTAB.variante_id <= $var_variante_id and
PRODUKTTEXTTAB.bezeichnung is not null
group by PRODUKTTAB.id_produkt, PRODUKTTEXTTAB.bezeichnung
also als einschränkung die gesuchte variante <= deiner suchbedingung ist aber gleichzeitig auch die bezeichnung gefüllt ist...
Gruß Netzfetzer