大家好!
我有这个表,我保留了类别,每个翻译都是一个不同的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
答案 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;