Kalle: MySQL: Problem mit JOIN und IN

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

  1. Wie kann ich in einem SQL-Kommando aus dem Feldinhalt de,nl 'de','nl' machen?

  2. Hi Kalle!

    Woran liegt es?

    Du suchst nach FIND_IN_SET.

    MfG H☼psel

    --
    "Es gibt Augenblicke, in denen eine Rose wichtiger ist als ein Stück Brot."
    Rainer Maria Rilke
    Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
    1. 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

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

        --
        "Es gibt Augenblicke, in denen eine Rose wichtiger ist als ein Stück Brot."
        Rainer Maria Rilke
        Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
        1. 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
          
          1. 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
            
  3. 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

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

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