3

给定两个表:

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

如何在一个智能查询中正确执行?

(我使用具有 I18N 行为的 MySQL 和 Doctrine ORM)

4

2 回答 2

4

我不知道你是否要求这个简单的查询:

对于'f':

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

你可以做两个left joins,第二个寻找默认语言。然后Acase可以在两者之间做出决定:

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 回答