Erstes Wort aus Aufzählung holen
Gast
- datenbank
0 Jens Holzkämper0 Gast
0 Tom3 Cheatah
Hallo,
in einem Datenfeld der Tabelle A stehen Kürzel (2- oder 3-stellig), getrennt durch Komma. Für das erste Kürzel muss ich die Langform aus Tabelle B holen. Wie lautet die MySQL- Syntax, wenn ich einen variabel langen Wert bis zum ersten Komma brauche?
A:
sprachen
--------
de,en,fr
nds,de,cz
B:
kurz lang
---- -------------
de deutsch
en english
nds plattdüütsch
SELECT
...
LEFT JOIN B
ON B.kurz = A.???
Viele Grüße, Gast
Tach,
in einem Datenfeld der Tabelle A stehen Kürzel (2- oder 3-stellig), getrennt durch Komma. Für das erste Kürzel muss ich die Langform aus Tabelle B holen. Wie lautet die MySQL- Syntax, wenn ich einen variabel langen Wert bis zum ersten Komma brauche?
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_substring-index sollte helfen, es klingt für mich aber so, als wäre deine Datenstruktur schlecht.
mfg
Woodfighter
Tach,
danke für substring_index
Nun kann es vorkommen, dass im Feld A.sprachen nur eine Sprache steht. Also versuche ich den JOIN so:
LEFT JOIN B
ON B.kurz = if( SUBSTRING_INDEX(A.sprachen,',',1), SUBSTRING_INDEX(A.sprachen,',',1), A.sprachen )
Es gibt zwar keinen Fehler, aber irgendwas stimmt nicht, kann auch im auswertenden PHP- Code sein (bin noch am Suchen).
... es klingt für mich aber so, als wäre deine Datenstruktur schlecht.
Ja. Das Feld A.sprachen hatte ursprünglich nur eine Sprache, nämlich die der Beschreibung im selben Satz. Weitere Sprachen werden in einer Übersetzungstabelle geführt.
Um eine Übersicht zu haben, wieviel und welche Sprachen für diesen Satz vorliegen, habe ich alle in dieses Feld gestellt. Das muss ich zurückbauen, es ergibt sich ja durch den JOIN.
Gruß, Gast.
Falsch:
Das muss ich zurückbauen, es ergibt sich ja durch den JOIN.
Richtig:
Das ergibt sich durch einen weiteren JOIN (nicht den besprochenen).
LEFT JOIN B
ON B.kurz = if( SUBSTRING_INDEX(A.sprachen,',',1), SUBSTRING_INDEX(A.sprachen,',',1), A.sprachen )Es gibt zwar keinen Fehler, ...
aber
if( SUBSTRING_INDEX(A.sprachen,',',1), ...
reicht nicht = PHP- Syntax. Es muss heissen
if( SUBSTRING_INDEX(A.sprachen,',',1) IS NOT NULL, ...
Jetzt stimmt es.
Hello,
in einem Datenfeld der Tabelle A stehen Kürzel (2- oder 3-stellig), getrennt durch Komma. Für das erste Kürzel muss ich die Langform aus Tabelle B holen. Wie lautet die MySQL- Syntax, wenn ich einen variabel langen Wert bis zum ersten Komma brauche?
A:
sprachende,en,fr
nds,de,czB:
kurz lang
de deutsch
en english
nds plattdüütsch
Ich würde annehmen, dass dies eine Lösung sein könnte.
SELECT b.lang from A a, B b where b.kurz in a.sprachen;
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello,
Ich würde annehmen, dass dies eine Lösung sein könnte.
SELECT b.lang from A a, B b where b.kurz in a.sprachen;
Oh Verzeihung. Du wolltest nur einen bestimmten Wert aus dem Set.
Da ist selbstverständlich die von Jens vorgeschlagene Funktion in die Abfrage einzubauen.
Meine Idee liefert ja alle Paarungen zu den Sets und ohne weitere Einschränkung auch noch über die gesamte Tabelle A, inclusive aller eventuell auftretender Redundanzen.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello,
A:
sprachende,en,fr
nds,de,czB:
kurz lang
de deutsch
en english
nds plattdüütschIch würde annehmen, dass dies eine Lösung sein könnte.
SELECT b.lang from A a, B b where b.kurz in a.sprachen;
Okay, dann würde ich aber drei Sätze bekommen (für jede Sprache einen) statt einem.
Gast
Hi,
in einem Datenfeld der Tabelle A stehen Kürzel (2- oder 3-stellig), getrennt durch Komma. Für das erste Kürzel
was meinst Du mit "das erste"? Deiner Beschreibung nach steht in der Datenzelle beispielsweise "de,en,fr". Daten in einer Datenbank sind atomar - das Wort bedeutet "unteilbar". Wie kann der unteilbare Wert "de,en,fr" etwas anderes als "de,en,fr" sein?
Wenn Du in "de,en,fr" etwas anderes siehst, vermutlich "de", "en" und "fr", so ist Dein Datenmodell defekt. Korrigiere bzw. repariere es. Beschäftige Dich hierzu mit dem Begriff der Normalisierung.
Cheatah
Wenn Du in "de,en,fr" etwas anderes siehst, vermutlich "de", "en" und "fr", so ist Dein Datenmodell defekt. Korrigiere bzw. repariere es. Beschäftige Dich hierzu mit dem Begriff der Normalisierung.
FIND_IN_SET() ist als Notlösung dafür aber durchaus geeignet ohne gleich seine Datenbank normalisieren zu müssen.
Hello,
Wenn Du in "de,en,fr" etwas anderes siehst, vermutlich "de", "en" und "fr", so ist Dein Datenmodell defekt. Korrigiere bzw. repariere es. Beschäftige Dich hierzu mit dem Begriff der Normalisierung.
FIND_IN_SET() ist als Notlösung dafür aber durchaus geeignet ohne gleich seine Datenbank normalisieren zu müssen.
... oder (bei MySQL) die implizite Lösung nehmen und den String-Datentyp Set oder Enum, je nach Bedarf. Der macht ja im Prinzip auch nichts anderes.
Ist jetzt die Frage, ob die Mögliche Anzahl für die Länderkürzel reichen wird. Man sollte immer noch Reserve behalten. Es könnten sich ja Kürzel ändern, also bezüglich der Datenkonsistenz dann dazukommen.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg