2016-08-23 2 views
0

다국어 앱을 만들었습니다.하나의 레코드가 존재하지 않으면 다른 것을 선택하십시오

표 것들

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

표 things_translations

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

내가 영어로 기본 언어 (로케일 = EN)가 : 데이터베이스는 것 같습니다.

번역본이 things_translations에서 영어가 아닌 다른 언어로 번역되어 있는데이 언어가 아직 데이터베이스에 존재하지 않는다면 영어 버전을 얻고 싶습니다.

나는 아래의 쿼리를 시도했지만 대신 모든 레코드를 반환했습니다

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 

을 내가 thing_id:2 모두 언어를 얻을 수 위의 쿼리로하지만 난 단지 ru locale하지 en 존재하기 때문에 싶어.

+0

당신은 또한 예상 된 결과를 추가 할 수 있습니까? – jarlh

+0

OR 조건을 사용해 보시지 않겠습니까? case보다는 things_translations.locale = ru 또는 things_translations.locale = en – Gopidoss

+0

@jarlh 나는 한 가지 로케일을 매번 모든 것에 대해 매번 가져오고 싶습니다. –

답변

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

나는 귀하의 CASE이 사실로 평가되므로 모든 것을 보여주고 있다고 생각합니다.

things_translations는 선택한 언어로 한 번, 영어로 한 번 각 조항에 참여할 수 있습니다. 그런 다음 열은 COALESCE(things_translations.title, things_translations_en.title)이됩니다. 즉, titles에 대해 things_translations (선택한 언어로 조인)을 시도하고, 이것이 null이면 things_translations_en의 제목을 사용하십시오. 또한 where 절에서 두 조인의 ID를 동일하게 만드는 것이 필요합니다. 그렇지 않으면 너무 많은 행이 생성됩니다.

1

나는 응용 프로그램의 동일한 유형의 작업 및 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

'where 절'에서 알 수없는 열 'ru'를 반환합니다. –

+0

효과가 있습니까? –

+0

도움을 주셔서 감사합니다, 나는 @ zakhefron 대답으로 해냈어. –

관련 문제