hawkmaster: WHERE? Default Wert nehmen ?

Hallo zusammen,
In einer MySQL Tabelle gibt es eine Spalte "Sprache".
Die Standard Sprache "ENG" ist immer vorhanden.

Es gibt eine SELECT Abfrage die abhängig der Sprache des Users ist ($db_col_language). Wenn es nun keinen Eintrag in der Tabelle mit dieser Sprache gibt soll immer die Standardsprache ENG genommen werden.
Bisher löse ich dies (vermutlich umständlich)  mit zwei Queries.
$sql_info = $DBO->query("SELECT InfoName,InfoLabel FROM configinfo WHERE Language = '{$db_col_language}' ") ;
while ($row_info = $sql_info->fetch(PDO::FETCH_ASSOC)){
$infolabel_arr[$row_jobinfo['InfoName']] = $row_jobinfo['InfoLabel'];
}
if(!$row_info){
$sql_jobinfo = $DBO->query("SELECT InfoName,InfoLabel FROM configinfo WHERE Language = 'ENG' ");
while ($row_jobinfo = $sql_jobinfo->fetch(PDO::FETCH_ASSOC)){
$infolabel_arr[$row_jobinfo['InfoName']] = $row_jobinfo['InfoLabel'];
}
}

Könnte man das auch einfacher in einer Select Abfrage lösen?
Also nach dem Motto "Wenn $db_col_language" leer, nimm Werte mit ENG ?

vielen Dank und viele Grüße
hawk

  1. Hallo Hawk,

    Es gibt eine SELECT Abfrage die abhängig der Sprache des Users ist ($db_col_language). Wenn es nun keinen Eintrag in der Tabelle mit dieser Sprache gibt soll immer die Standardsprache ENG genommen werden.
    Also nach dem Motto "Wenn $db_col_language" leer, nimm Werte mit ENG ?

    wie so ziemlich alle Datenbankmanagementsysteme auch kennt MySQL die Funktion COALESCE(), die genau das liefert, was Du haben möchtest:

    SELECT  
        COALESCE(sprache, 'ENG')  
    FROM  
        tabelle
    

    Dies setzt voraus, dass für "keine Angabe" der dafür passende Wert, nämlich NULL verwendet wird.

    Freundliche Grüße

    Vinzenz

    1. Hallo Vinzenz,

      vielen Dank für deine Hilfe.
      hmm,
      vielleicht habe ich "COALESCE" nicht ganz verstanden, aber bedeutet das nicht das ich unterschiedliche Spalten für die Sprache haben müsste?
      Ich habe aber nur eine Spalte für die Sprache und möchte ja nur andere Spaltenwerte selektieren und nur anhand der Sprache unterscheiden.

      $sql_info = $DBO->query("SELECT InfoName,InfoLabel FROM configinfo WHERE Language = '{$db_col_language}' ") ;
      while ($row_info = $sql_info->fetch(PDO::FETCH_ASSOC)){
      ...
      z.b. Tabelle configinfo:

      InfoName InfoLabel Language
      ------------------------------
      Name1    Label1    ENG
      Name2    Label2    ENG
      NaDEU    LabDEU    DEU

      Angenommen die Sprache des Users Fritz ($db_col_language) wäre DEU und es gibt keinen Eintrag mit der Zeile DEU sondern nur ENG.
      Obige SELECT Abfrage würde dann bei mir nichts enthalten bzw. schlägt fehl.
      Dann sollten Die Zeilen mit dem Default Wert ENG gelesen werden.

      SELECT

      COALESCE(sprache, 'ENG')
      FROM
          tabelle

      
      >   
      > Dies setzt voraus, dass für "keine Angabe" der dafür passende Wert, nämlich NULL verwendet wird.  
        
      vielen Dank und viele Grüße  
      hawk
      
      1. Hallo

        vielleicht habe ich "COALESCE" nicht ganz verstanden,

        sehr wahrscheinlich.

        aber bedeutet das nicht das ich unterschiedliche Spalten für die Sprache haben müsste?

        Nein.

        Ich habe aber nur eine Spalte für die Sprache und möchte ja nur andere Spaltenwerte selektieren und nur anhand der Sprache unterscheiden.

        Ja, dafür nimmt man COALESCE().

        $sql_info = $DBO->query("SELECT InfoName,InfoLabel FROM configinfo WHERE Language = '{$db_col_language}' ") ;

          
        SELECT  
            InfoName,  
            InfoLabel,  
            COALESCE(Language, 'ENG')  
        FROM  
            configinfo
        

        Fertig. Ausprobieren mit dem SQL-Client Deiner Wahl.

        InfoName InfoLabel Language

        Name1    Label1    ENG
        Name2    Label2    ENG
        NaDEU    LabDEU    DEU

        Angenommen die Sprache des Users Fritz ($db_col_language) wäre DEU und es gibt keinen Eintrag mit der Zeile DEU sondern nur ENG.

        ?? was willst Du mir damit sagen.
        Ich sehe keinen Fritz, ich habe keine Ahnung, was $db_col_language bedeutet, ich sehe keine zweite Tabelle.

        Obige SELECT Abfrage würde dann bei mir nichts enthalten bzw. schlägt fehl.
        Dann sollten Die Zeilen mit dem Default Wert ENG gelesen werden.

        Wenn Du zwei Tabellen hast, nimm einen LEFT JOIN und COALESCE().

        Freundliche Grüße

        Vinzenz

      2. wenn ich richtige denke hast du recht und COALESCE hilft dir nicht weiter

        ich wüsste eine möglichkeit die allerdings wahrscheinlich relativ unperformant ist

        SELECT InfoName,InfoLabel FROM configinfo WHERE Language = '{$db_col_language}' UNION SELECT InfoName,InfoLabel FROM configinfo WHERE Language = 'ENG';

        und dann einfach den ersten Datensatz nehmen

        allerdings glaub ich auch schon mal was zu if in sql statements gelesen zu haben das war aber nur bei MSSQL glaub ich...

      3. Hallo hawk,

        vielleicht habe ich "COALESCE" nicht ganz verstanden, aber bedeutet das nicht das ich unterschiedliche Spalten für die Sprache haben müsste?
        Ich habe aber nur eine Spalte für die Sprache und möchte ja nur andere Spaltenwerte selektieren und nur anhand der Sprache unterscheiden.

        wie üblich die Bitte:
        Poste die relevanten Tabellen, gefüllt mit ein paar Beispieldatensätzen und das gewünschte Ergebnis - mit der Begründung, warum Du dieses Ergebnis haben möchtest. Es kann sein, dass ich überhaupt nicht verstanden habe, was Du willst - ich bin mir jedoch sicher, dass Du genau COALESCE suchst, es nur nicht weißt.
        Ich bin mir sicher, dass der Join-Nachbau in PHP überflüssig ist.

        Freundliche Grüße

        Vinzenz

  2. Hi,

    warum trägst du nicht in die fragliche Spalte als default-Wert einfach Eng ein? Oder gibt es einen Grund warum die Spalte (z.B. für andere Abfragen) leer sein muss?

    bye trunx

    --
    Die Standard-Antwort: "Bitte benutze die Forum-Suche!" macht die Forum-Suche kaputt, weil die Suche dann nämlich genau vor allem diese dämliche Standard-Antwort, also Müll liefert. Sinnvoller ist stattdessen folgende Standard-Antwort: "Dieses Thema wurde schon vielfach im Forum besprochen, siehe z.B. <a>hier</a> oder <a>hier</a> oder benutze die Forum-Suche z.B. mit den Stichworten 'Stichwort1 Stichwort2'." Danke.
    1. Hallo,

      warum trägst du nicht in die fragliche Spalte als default-Wert einfach Eng ein? Oder gibt es einen Grund warum die Spalte (z.B. für andere Abfragen) leer sein muss?

      dann ginge eine Information verloren:
      Es ist ein Unterschied, ob _keine_ Standardsprache oder Englisch als Standardsprache ausgewählt ist.

      Bei Deinem Vorschlag kann man diesen Unterschied nicht mehr feststellen.
      Ich halte diese Designentscheidung des OP für sinnvoll.

      Freundliche Grüße

      Vinzenz