Gast: Erstes Wort aus Aufzählung holen

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

  1. 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

    1. 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.

      1. Falsch:

        Das muss ich zurückbauen, es ergibt sich ja durch den JOIN.

        Richtig:
        Das ergibt sich durch einen weiteren JOIN (nicht den besprochenen).

      2. 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.

  2. 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:
    sprachen

    de,en,fr
    nds,de,cz

    B:
    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

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. 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

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
    2. Hello,

      A:
      sprachen

      de,en,fr
      nds,de,cz

      B:
      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;

      Okay, dann würde ich aber drei Sätze bekommen (für jede Sprache einen) statt einem.

      Gast

  3. 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

    --
    X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. 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.

      1. 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

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de