MySQL: Problem mit JOIN und IN
Kalle
- datenbank
0 Kalle0 Hopsel0 Kalle0 Hopsel0 Danke
Kalle0 Ilja
0 Matti Mäkitalo
Hallöle,
in einer Tabelle gibt es das Feld "sprachen" mit dem Inhalt de,nl
Nun möchte ich aus der Sprachentabelle zu diesen Sprachen die Langform holen:
sprache_kurz sprache_lang
------------ --------------
de deutsch
nl nederlands
Mein Versuch:
SELECT *
FROM tabelle trm1
-- SPRACHEN LANGFORM
LEFT JOIN sprachen spr1
ON spr1.sprache_kurz IN ( trm1.sprachen )
WHERE ...
Das Ergebnis für sprache_lang ist NULL. Wenn ich aber die Zeile
ON spr1.sprache_kurz IN ( 'de','nl' )
verwende, kommt das richtige Ergebnis.
Woran liegt es?
Gruß, Kalle
Wie kann ich in einem SQL-Kommando aus dem Feldinhalt de,nl 'de','nl' machen?
Hi Kalle!
Woran liegt es?
Du suchst nach FIND_IN_SET.
MfG H☼psel
Hi H☼psel!
Du suchst nach FIND_IN_SET.
Danke für den Tipp, habe ich mir angesehen. Doch FIND_IN_SET braucht eine Vorgabe, z.B. 'nl', um mir dann zu sagen, dass 'nl' im String 'de,nl' an zweiter Stelle steht.
Ich kann im SQL-Kommando nicht nach bestimmten Sprachen suchen, denn die Anzahl der möglichen Sprachen ist unüberschaubar, wenn ich mal die Dialekte einbeziehe.
Irgandwann gibt jemand süd-afghanisch ein und das Programm kommt damit nicht klar. Also die Sprachen dürfen nicht Bestandteil des Codes sein.
Gruß, Kalle
Hi Kalle!
Danke für den Tipp, habe ich mir angesehen. Doch FIND_IN_SET braucht eine Vorgabe, z.B. 'nl', um mir dann zu sagen, dass 'nl' im String 'de,nl' an zweiter Stelle steht.
Ich dachte, du möchtest die Langform der Sprachbezeichnung haben?
SELECT
*,
GROUP_CONCAT(DISTINCT spr1.sprache_lang SEPARATOR ',') as sprachen
FROM tabelle trm1
LEFT JOIN sprachen spr1
ON FIND_IN_SET(spr1.sprache_kurz, trm1.sprachen )
GROUP BY trm1.id
Ich kann im SQL-Kommando nicht nach bestimmten Sprachen suchen, denn die Anzahl der möglichen Sprachen ist unüberschaubar, wenn ich mal die Dialekte einbeziehe.
Irgandwann gibt jemand süd-afghanisch ein und das Programm kommt damit nicht klar. Also die Sprachen dürfen nicht Bestandteil des Codes sein.
Was hat das mit der Langform der Sprachen in der Projektionsliste zu tun?
Wenn du die Möglichkeit bieten möchtest, nach bestimmten Sprachen (lang oder kurz) zu selektieren, dann machst du das über die WHERE-Klausel.
MfG H☼psel
Moin H☼psel!
SELECT
*,
GROUP_CONCAT(DISTINCT spr1.sprache_lang SEPARATOR ',') as sprachen
FROM tabelle trm1
LEFT JOIN sprachen spr1
ON FIND_IN_SET(spr1.sprache_kurz, trm1.sprachen )
GROUP BY trm1.id
Danke dir, das ist der richtige Lösungsansatz.
Gruß, Kalle
moin,
bei dieser abfrage...
SELECT
*,
GROUP_CONCAT(DISTINCT spr1.sprache_lang SEPARATOR ',') as sprachen
FROM tabelle trm1
LEFT JOIN sprachen spr1
ON FIND_IN_SET(spr1.sprache_kurz, trm1.sprachen )
GROUP BY trm1.id
kann man nur plug bekommen ;-) welche risiken es bei MySQL bezüglich der gruppierung gibt, das wurde hier schon sehr oft diskutiert und gezeigt. und warum eigentlich einen OUTER JOIN, gibt es den werte in der tabelle trml, die keinen entsprechenden partner in der tabelle sprache hat ?
Ilja
Hi,
in einer Tabelle gibt es das Feld "sprachen" mit dem Inhalt de,nl
Mittel- bis langfristig ist es sicherlich einfacher, wenn du deine Tabelle besser normalisierst. Dazu gehört, dass Daten atomar abgespeichert werden sollten, d.h., dass in einer Zelle nur eine Information enthalten ist und kein Feld, wie in deinem Fall.
Bis die Tage,
Matti
Hallo, Matti,
Mittel- bis langfristig ist es sicherlich einfacher, wenn du deine Tabelle besser normalisierst. Dazu gehört, dass Daten atomar abgespeichert werden sollten, d.h., dass in einer Zelle nur eine Information enthalten ist und kein Feld, wie in deinem Fall.
Mmh - nachdenk.
Es ist so, dass in 99,5% der Fälle nur eine Sprache (i.d.R. deutsch) für den Datensatz vorhanden ist. Falls weitere dazukommen, sind sie in einer Übersetzungstabelle hinterlegt.
Du meinst, ich sollte die Übersetzungstabelle auch für deutsch benutzen?
In meinem geschilderten Fall komme ich an die zweite und weitere Sprachen nl=nederlands jetzt wie folgt:
SELECT *
,spr1.sprache_lang spr_lang
FROM tabelle trm1
-- ZUSATZSPRACHEN
LEFT JOIN uebersetzungen ueb1
ON (ueb1.tabelle = 'tabelle'
AND ueb1.tabelle_id = trm1.id )
-- SPRACHEN LANGFORM
LEFT JOIN sprachen spr1
ON spr1.sprache_kurz = ueb1.sprache
Allerdings fehlt dann die erste Sprache.
Gruß, Kalle
Allerdings fehlt dann die erste Sprache.
Kann ich per SQL einen Teilstring bis zum ersten Komma selektieren?
Der Spracheintrag könnte sein 'nds,de', also Plattdeusch zuerst. Ich kann nicht blind die beiden ersten Stellen greifen.
Gruß, Kalle