mysql选择不存在的总数

时间:2013-07-18 11:15:14

标签: php mysql

我试图计算所有缺失的翻译,并真正迷失了如何做到这一点。

表:

  • 语言(language_id,name)
  • 产品(product_id)
  • product_translations(product_id,language_id,name)

管理员变得非常懒惰,我希望能够向他们展示缺少多少翻译的数量。

我想这样做非常简单就是获得总数(语言 - >计数*产品 - >计数),但我想分别返回每个产品的计数。

1 个答案:

答案 0 :(得分:1)

要执行此类查询,请从包含所有组合的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;

这使用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;