Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL-按语言id比较两行-查找不存在翻译的行_Php_Mysql_Sql_Translation - Fatal编程技术网

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

Php MySQL-按语言id比较两行-查找不存在翻译的行,php,mysql,sql,translation,Php,Mysql,Sql,Translation,各位! 我有一个表,我在其中保存类别,每个翻译都是一个具有不同语言id的新行 categories_id language_id categories_name 8032 4 Dukke 8032 10 Doll 8029 10 Bike 8074 4 Bil 我想获取那些没有语言id 4

各位!

我有一个表,我在其中保存类别,每个翻译都是一个具有不同语言id的新行

categories_id   language_id     categories_name
8032            4               Dukke
8032            10              Doll
8029            10              Bike
8074            4               Bil
我想获取那些没有语言id 4或语言id 10翻译的行。在这种情况下,输出如下:

categories_id   language_id     categories_name
8029            10              Bike
8074            4               Bil
TRANSLATION 1 - TRANSLATION 2
Bike - [add translation]
[add translation] - Bil
前端中的最终结果将是如下列表:

categories_id   language_id     categories_name
8029            10              Bike
8074            4               Bil
TRANSLATION 1 - TRANSLATION 2
Bike - [add translation]
[add translation] - Bil

如果只有两种语言,则可以将表本身连接起来

比如:

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
对于更多语言,您必须多次执行类似操作。

更新

一个更好的解决方案是以表格为中心;如果你将有更多的语言,你只需要添加的情况下,当。。。新语句的结束语句

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
试试看。

试试这个:它应该适合你,使用每个类别id的最小值的子查询收集主语言id,然后使用具有相同id和类别的最小语言id的相同表联接以检索主翻译,即翻译1,然后再次使用相同id但不等于语言id的子查询联接以检索翻译2,并检查语言id是否为空下:

SELECT t.id, 
    t1.category_name AS TRANSLATION_1, 
    t2.category_name AS TRANSLATION_2
FROM (SELECT ID, MIN(language_id) language_id FROM test GROUP BY ID) t
LEFT JOIN test t1 ON t1.id = t.id 
    AND t1.language_id = t.language_id
LEFT JOIN test t2 ON t2.id = t.id 
    AND t2.language_id <> t.language_id
WHERE (t1.language_id IS NULL OR t2.language_id IS NULL)    

您可以通过使用单词和语言生成所有可能的行来实现这一点。然后删除不存在的:

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;

按id从您的表组中选择id、类别名称、语言id,类别名称、语言id有计数*<2显示您的代码。有多少种语言,多于2种?@jeroen目前只有两种这一切都来自单个表??谢谢!遗憾的是,它没有起作用。返回的结果为零。@DennisA您确定两种语言的ID相同吗?看起来很奇怪,有重复的身份证…是的,我肯定!我认为这为我指明了正确的方向。我现在得到的结果是:8026 Stel m.m.Stel m.m.8026 Stel m.m.Ramar等。我只需要这样的结果:8026 Stel m.m.Ramar等,并且只有两行中的一行是空的,所以像这8026一样的东西在这里是空的,Ramar等。我有,我担心它不能像预期的那样工作-它返回一堆误报。得到一堆身份证才是翻译的真正目的exists@DennisA哦,我明白了。。。问题解决了,伙计!我已经更新了pivot查询。不过,我不需要那个输出。这就是问题所在。我需要两个类别名称中的一个是空的。现在尝试一下,更新的答案肯定会满足您的要求。这似乎是迄今为止最接近的答案:-我正在尝试摆弄它来给我正确的结果。恐怕这不是我需要的-再次阅读问题,please@DennisA . . . 这将为您提供所有缺少翻译的类别。这似乎是您所要求的,但并非如我所提到的,我不需要删除没有翻译的行,我特别需要将它们保留为空字段。