我试图计算所有丢失的翻译,并真正迷失了如何去做。
表:
- 语言(language_id,名称)
- 产品(product_id)
- product_translations (product_id, language_id, name)
管理员变得非常懒惰,我希望能够向他们展示缺少多少翻译的数量。
我想这样做的一个非常简单的方法就是获取总数(语言->计数*产品->计数),但我想分别返回每个产品的计数。
要执行此类查询,请从包含driver
所有组合的表(子查询)开始。然后删除那些有翻译的:
select driver.*
from (select distinct l.language_id, p.product_id
from languages l cross join
products p
) driver left outer join
translations t
on t.language_id = driver.language_id and
t.product_id = driver.product_id
where t.language_id is null;
这使用 a left outer join
,它将所有内容都保存在driver
表中。如果没有匹配,那么中的列translations
将是NULL
--where
子句只保留这些。
如果每个表中的distinct
值都是唯一的,则子查询中可能不需要。
注意:以上是我编写查询的首选方式,因为我认为它的意图是最清晰的。但是,MySQL 实际上实现了子查询。因此,如果两个引用表中的列是唯一的,则以下方法更有效:
select l.*, p.*
from languages l cross join
products p left outer join
translations t
on t.language_id = l.language_id and
t.product_id = p.product_id
where t.language_id is null;