2016-08-23 5 views
0

Ich habe eine Multi-Language-App gebaut. Die Datenbank wie folgt aussieht:Wenn ein Datensatz nicht existiert, wähle einen anderen

Tabelle Dinge

|id| img |url| 
-------------- 
|1 |  | | 
|2 |  | | 
|3 |  | | 

Tabelle things_translations

|id| thing_id | title | locale | 
--------------------------------- 
|1 |  1  |  | en | 
|2 |  2  |  | en | 
|3 |  3  |  | en | 
|4 |  2  |  | ru | 

ich die Standard-Sprache in Englisch (locale = en) haben.

Wenn ich die Übersetzungen title von things_translations in einer anderen Sprache als Englisch bekomme und diese Sprache noch nicht in der Datenbank existiert, würde ich gerne die englische Version davon bekommen.

Ich habe die unten Abfrage versucht, aber gibt alle Datensätze statt:

select things.id 
FROM things 
INNER JOIN things_translations ON things.id = things_translations.thing_id 
WHERE CASE WHEN things_translations.locale = ru IS NULL 
THEN things_translations.locale = en END 

Mit der obigen Abfrage, die ich für thing_id:2 sowohl Sprache bekommen, aber ich will nur die ru locale nicht die en weil exist bekommen.

+0

Können Sie auch das erwartete Ergebnis hinzufügen? – jarlh

+0

Warum versuchen Sie nicht, OR-Bedingung? anstatt dinge_translations.locale = ru oder sachen_translations.locale = de – Gopidoss

+0

@jarlh Ich möchte immer nur ein Gebietsschema für jedes Ding nicht alle bekommen. –

Antwort

1
SELECT IFNULL(TT1.title,TT.title) 
FROM things T 
LEFT JOIN things_translations TT 
    ON (T.id = TT.thing_id AND TT.locale = 'en') 
LEFT JOIN things_translations TT1 
    ON (T.id = TT1.thing_id AND TT1.locale = 'ru') 
WHERE T.id = 2; 

SQL Demo

0

Ich denke, Ihre CASE bewertet zu wahren, also zeigt alles.

Sie könnten sites_translations zweimal hinzufügen - einmal mit Ihrer ausgewählten Sprache und einmal mit Englisch in den jeweiligen Klauseln. Dann wäre Ihre Spalte COALESCE(things_translations.title, things_translations_en.title). Mit anderen Worten, versuchen Sie sheets_translations (Ihr Join für ausgewählte Sprache) für Titel, und wenn das null ist, verwenden Sie den Titel von stings_translations_en. Sie brauchen auch in Ihrer where-Klausel etwas, das die IDs der beiden Joins gleich macht, sonst erhalten Sie zu viele Zeilen.

1

Ich habe Arbeit an derselben Art von Anwendung und lösen mein Problem mit CASE:

SELECT t.id FROM things t 
INNER JOIN things_translations tt ON t.id = tt.thing_id 
AND tt.locale = CASE WHEN 
EXISTS(SELECT tte.locale FROM things_translations tte WHERE tt.thing_id = t.id AND tte.locale = 'ru') THEN 'ru' 
    ELSE 'en' 
    END 
+0

Es gibt Unbekannte Spalte 'ru' in 'where Klausel' –

+0

Ist es für Sie arbeiten? –

+0

Vielen Dank für Ihre Hilfe, ich habe es mit @zakhefron Antwort. –

Verwandte Themen