3

与えられた2つのテーブル:

image(id, cat_id, name)
image_translation(id, title, desc, lang)

(名前とIDは一意です)

特定のファイルのすべての翻訳を選択するためのクエリ:

SELECT c.id           AS c__id, 
       c.cat_id       AS c__cat_id, 
       c.name         AS c__name, 
       c2.id          AS c2__id, 
       c2.title       AS c2__title, 
       c2.desc        AS c2__desc, 
       c2.lang        AS c2__lang, 
FROM   image c 
       LEFT JOIN image_translation c2 
              ON c.id = c2.id 
WHERE  ( c1.name = 'file.jpg' ) 

戻り値:

c__id | c__cat_id  | c2__id    | c__name   | c2__title     | cs__desc     | c2__lang
------+------------+-----------+-----------+---------------+--------------+--------- 
114   | 2          | 114       | file.jpg  | default title | default desc | en
114   | 2          | 114       | file.jpg  | NULL          | desc in de   | de
114   | 2          | 114       | file.jpg  | title in fr   | ''           | fr

特定の言語で特定のファイルの翻訳を選択するには、明らかにwhere句を追加する必要があります。

ただし、デフォルトの行コンテンツが返されます。これには、翻訳時に空のフィールドが含まれる場合があります。

結果をデフォルト値とマージし、empyフィールドをデフォルト値で上書きするにはどうすればよいですか?lang en:のデフォルト値が返されます。

SELECT c2.title       AS c2__title, 
       c2.desc        AS c2__desc, 
       c2.lang        AS c2__lang, 
FROM   image c 
       LEFT JOIN image_translation c2 
              ON c.id = c2.id 
WHERE  ( c1.name = 'file.jpg' ) 
AND WHERE ( c2.lang = 'en')

私が期待するサンプル結果:

ドイツ語の場合:

-- AND WHERE ( c2.lang = 'de' ) 

c__id | c__cat_id | c2__id    | c__name   | c2__title     | cs__desc     | c2__lang
-----+------------+-----------+-----------+---------------+--------------+--------- 
114  | 2          | 114       | file.jpg  | default title | desc in de   | de

フランス語の場合:

-- AND WHERE ( c2.lang = 'fr' ) 

c__id | c__cat_id | c2__id    | c__name   | c2__title     | cs__desc     | c2__lang
-----+------------+-----------+-----------+---------------+--------------+--------- 
114  | 2          | 114       | file.jpg  | title in fr   | default desc | fr

1つのスマートクエリでそれを正しく行う方法は?

(私はMySQLとDoctrine ORMをI18Nの動作で使用しています)

4

2 に答える 2

4

この単純なクエリを要求しているかどうかはわかりません。

'fr'の場合:

SELECT c2.title AS c2__title, 
       coalesce( nullif( c2.desc, '') , c3.desc )   AS desc, 
       coalesce( nullif( c2.lang, '') , c3.lang  )  AS lang, 
FROM   image c 
LEFT JOIN image_translation c2 
              ON c2.lang = 'fr' and c.id = c2.id 
LEFT JOIN image_translation c3
              ON c3.lang = 'en' and c.id = c3.id 
WHERE  ( c1.name = 'file.jpg' ) 
于 2012-11-01T20:31:47.510 に答える
2

2つを実行できleft joins、2つ目はデフォルトの言語を検索します。次に、 Acaseは2つの間で決定できます。

select case 
       when it1.title = '' or it1.title is null then it2.title 
       else it1.title 
       end as title
,      case 
       when it1.desc = '' or it1.desc is null then it2.desc
       else it1.desc
       end as desc
from   image i
left join
       image_translation it1
on     c.id = c2.id 
       and it1.lang1 = 'fr'
left join
       image_translation it2
on     c.id = c2.id 
       and it2.lang1 = 'en'
where  i.name = 'file.jpg'
于 2012-11-01T20:37:54.600 に答える