SQL添加“不存在”行基于对所有变体的结果并删除重复
问题描述:
我想添加虚拟(不存在)的行获得系统中的所有可用翻译列表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
表。
协议:
行〜实体〜记录
感谢您的帮助!
答
试试这个(我没有跑,可能是语法错误)
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
谢谢,艾克!但是在标题领域没有模式,我也想从源实体获取任何字段。我已经填补了一些问题的描述,以避免这种误解。 –