MySQL-按语言ID比较两行 - 查找翻译不存在的行

时间:2018-01-15 11:01:03

标签: php mysql sql translation

大家好!

我有这个表,我保留了类别,每个翻译都是一个不同的language_id的新行。

categories_id   language_id     categories_name
8032            4               Dukke
8032            10              Doll
8029            10              Bike
8074            4               Bil

我想获取那些没有翻译language_id 4或language_id 10的行。所以在这种情况下,输出将是这样的:

categories_id   language_id     categories_name
8029            10              Bike
8074            4               Bil

前端的最终结果将是这样的列表:

TRANSLATION 1 - TRANSLATION 2
Bike - [add translation]
[add translation] - Bil

4 个答案:

答案 0 :(得分:1)

<强>更新

更好的解决方案是转动表格;如果您将拥有更多语言,则只需为新的语句添加CASE WHEN ... END语句

SELECT * FROM (
    SELECT
        category_id
        ,MAX(CASE WHEN lang_id = 10 THEN category_name end) AS Translation_1
        ,MAX(CASE WHEN lang_id = 4 THEN category_name end) AS Translation_2
    FROM (SELECT category_id, category_name, lang_id from tbl) t
    group by category_id) t
WHERE Translation_1 is null OR Translation_2 is null

试试here

答案 1 :(得分:0)

如果只有两种语言,您可以自己加入表格。

类似的东西:

SELECT 
  t1.ID, t1.CATEGORY_NAME, t2.CATEGORY_NAME
FROM your_table t1
LEFT JOIN your_table t2
  ON t1.ID = t2.ID
WHERE t1.LANGUAGE_ID = 1
  AND t2.ID IS NULL

对于更多语言,您必须多次执行类似操作。

答案 2 :(得分:0)

试试这个:它应该适合您,使用subquery收集每个类别ID为MIN的主要语言ID,然后使用相同的{{}加入同一个表1}}和min ID类别来检索language_id的主要翻译,然后再次使用相同的TRANSLATION_1加入ID not equal to来检索{{1}如果language_id如下,请检查条件:

TRANSLATION_2

输出: --IF语言之一为NULL

language_id IS NULL

答案 3 :(得分:0)

您可以通过使用单词和语言生成所有可能的行来执行此操作。然后删除不存在的那些:

select c.category_name, l.language_id
from (select distinct category_name from t) c cross join
     (select distinct language_id from t) l left join
     t
     on t.category_name = c.category_name and t.language_id = l.language_id
where t.category_name is null;