WHERE? Default Wert nehmen ?
hawkmaster
- datenbank
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
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
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
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
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...
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
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
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