2017-11-25 90 views
0

我想添加虚拟(不存在)的行获得系统中的所有可用翻译列表SQL添加“不存在”行基于对所有变体的结果并删除重复

我想要得到的是象下面这样: (例如1)

 
id  title  source_langcode target_langcode | (type) 
----------------------------------------------------| 
...             | 
205 Iriure EN   en    en   | ⟵ original 
205 Iriure EN   en    de   | ⟵ non translated (virtual) 
205 IriUKure   en    uk   | ⟵ translation 
...             | 

什么我有现在: (例如2)

 
id  title  source_langcode target_langcode | 
----------------------------------------------------| 
...             | 
205 Iriure EN   en    en   | ⟵ original     
205 IriUKure   uk   DYMMY_LANGCODE | ⟵ translation 
205 Iriure EN   en    uk   | ⟵ this is redundant 
205 Iriure EN   en    de   | ⟵ non translated (virtual) 
... 

问题
translations表存储只翻译&原始实体,但我需要为非翻译实体也添加翻译,这个“虚拟”记录(他们的字段)应该基于源实体字段。

概述
有在这个系统

languages两个表 - 系统中的所有可用语言的列表(例如3)

 
id  langcode 
---------------- 
1  en 
2  de 
3  uk 

translations - 源实体的名单及其基于源实体的翻译(示例4)

 
id  title  langcode default_langcode created changed ... ... 
--------------------------------------------------------------------------------- 
... 
205  Iriure EN  en   1   xxxxxxxxxx xxxxxxxxxx 
205  IriUKure  uk   0   xxxxxxxxxx xxxxxxxxxx 
206  UK Nunc UK  uk   1   xxxxxxxxxx xxxxxxxxxx 
207  LucidusDE  de   1   xxxxxxxxxx xxxxxxxxxx 
... 

为了指示当前行是一个源用来default_langcode(INT)柱,但在其它情况下default_langcode => 0意味着这是一个翻译

试图解决方案:溶液的
一个使用交叉连接被在languages表只有default_langcode = 1行,但在这种情况下,我从翻译的来源实体领域。 我用:

SELECT 
    translations.id AS id, 
    translations.title, 
    translations.langcode AS source, 
    translations.created AS created, 
    l.langcode, 
    tr.langs as translations_langs, 
    IF(FIND_IN_SET(l.langcode, tr.langs) AND translations.langcode <> l.langcode, 1, 0) as is_translation 
FROM 
    translations translations 

CROSS JOIN languages l 

INNER JOIN (
    SELECT 
    translations.id, 
    GROUP_CONCAT(translations.langcode separator ',') as langs, 
    COUNT(translations.langcode) as items 
    FROM translations translations 
    GROUP BY translations.id 
) AS tr ON translations.id = tr.id 

WHERE node_field_data.default_langcode = '1' 

ORDER BY node_field_data.id 

,我试过用UNION另一种解决方案,但在这种情况下,我有像example 1与冗余行的结果。

查询:

(SELECT 
    translations.id AS id, 
    translations.title, 
    translations.langcode AS source_language, 
    l.langcode as target_language, 
    translations.created AS created 

FROM 
    translations translations 

CROSS JOIN languages l 

WHERE 
    translations.default_langcode = '1' 
) 

UNION ALL 

(SELECT 
    translations.id AS id, 
    translations.title, 
    translations.langcode AS source_language, 
    'DYMMY_LANGCODE' as target_language , 
    translations.created AS created 

FROM 
    translations translations 

WHERE 
    translations.default_langcode = '0' 
) 

ORDER BY id 

摘要: 我需要的就是让所有的语言和每个翻译langcodes之间的差异(其中default_langcode = 0),并添加有默认值额外行(标题, (其中default_langcode = 1)

个人而言,我宁愿不使用工会,因为系统的具体事情,但如果这是唯一的方式,那么它是好的。 理想情况下,我想用连接translations表。

协议
行〜实体〜记录

感谢您的帮助!

回答

0

试试这个(我没有跑,可能是语法错误)

SELECT t1.Id, 
ISNULL(t.title,t1.title+'_'+t1.langcode) title, 
t1.source_langcode, 
t1.langcode target_langcode, 
CASE 
WHEN t1.default_langcode = t.langcode THEN '(original)' 
WHEN t.langcode IS NULL THEN '(non translated)' 
ELSE '(translation)' 
END 
FROM 
(
--GET AllCodes trim suffix 
SELECT t.Id,t.title,l.langcode,t.source_language 
(SELECT Id,LEFT(title, LEN(title)-3) title, langcode source_language 
FROM translations 
WHERE default_langcode = 1 
) t 
JOIN lanquages ON 1=1 
) t1 
LEFT JOIN translations t ON t1.Id = t.Id AND t1.langcode = t.langcode 
+0

谢谢,艾克!但是在标题领域没有模式,我也想从源实体获取任何字段。我已经填补了一些问题的描述,以避免这种误解。 –