2017-11-25 74 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

謝謝,艾克!但是在標題領域沒有模式,我也想從源實體獲取任何字段。我已經填補了一些問題的描述,以避免這種誤解。 –