Frank (no reg): Datenbank - multilanguage - fallback

Beitrag lesen

Hi,

du kannst keine "NULL-rows" erhalten. Entweder du erhältst _keine_ Rows, dann sind die Spalten dieser "_keine_" Rows auch NULL. Und dafür hast du ja COALESCE.

Zowu? Äh, wozu bitte GROUP BY?

Die JOIN Klausel "ON p.name = ml.id" scheint mir auch etwas bisweilen extremst sinnfrei. Du verbindest den Namen (Text?) der Produkts aus der Produkt-Tabelle mit der Id (Zahl??) der MultiLanguage-Tabelle? Kein Wunder, dass du NULL-Rows bekommst.

Und woher kommt "produkt_id"?

Mal künstlich konstruiert, du hast die Tabellen
"Produkt" (Id int, Name varchar(255))
"MultiLanguage" (produkt_id int, language char(2), eigenschaft varchar(255), text varchar(255))

... joinst dann (1) auf MultiLanguage mit den Bedingungen
on multilanguage.produkt_id = produkt.id
and multilanguage.language = 'cn'
and multilanguage.eigenschaft = 'produktname'

und dann (2) noch mal für die Fallback-Sprache
on multilanguage.produkt_id = produkt.id
and multilanguage.language = 'en'
and multilanguage.eigenschaft = 'produktname'

für (1) bekommst du (k)eine Row, keine Row heisst, die Spalt MultiLanguage.Text ist nicht vorhanden und damit ihr Wert NULL. Falls es doch Rows gibt aus diesem LEFT JOIN, dann kann die .Text Spalte immer noch NULL sein, weil ein Depp vergessen hat, da einen Wert einzutragen. Das ist aber völlig belanglos, du benutzt ja COALESCE.

für (2) bekommst du hoffentlich genau 1 Row, oder ...

  • wenn > 1 Row, dann hast du ein massives Problem mit deinem Design,
  • wenn < 1 Row, dann gibt es einfach keinen Fallback-Wert für diese Eigenschaft des Produktes. (Punkt). Und dafür haben wir ja wieder, na was?, COALESCE()
  • wenn = 1 Row und .Text ist nicht NULL ... hurra, Sie haben gewonnen!

Wenn du dann noch wissen willst, aus welcher Sprache der finale Wert gekommen ist, dann verwendest du ... na, rate mal, COALESCE() ... nur mit einem Feld, welches bezeichnend für die Sprache ist ... aber auch NULL sein kann, wenn's keinen Wert in der Sprache hat.

Mein Gott, das kann doch nun wirklich nicht so kompliziert sein.

Ciao, Frank