SQL:如何从连接复杂的查询中获取唯一值的出现次数?

时间:2013-08-02 20:45:29

标签: mysql group-by aggregate-functions duplicate-removal

我有三张桌子:

  • 内容
  • CONTENT_CATEGORY
  • Content_Class

有四种类型的内容类,Content_Class与内容行有很多:1关系,用于将每个内容与一个或多个类链接。

同样的规则适用于类别,它与内容行也有很多:1。

我的目标是,给定一组内容行可能在类别上过滤,每个类的Content_Class行的聚合计数是多少?

我当前的查询:

SELECT cc.class_Id, COUNT(*) AS `records`
    FROM Content_Class cc
    LEFT JOIN Content c ON c.id = cc.content_id
    LEFT JOIN Content_Category ccat ON c.id = ccat.content_id
    WHERE cc.class_id IS NOT NULL
    GROUP BY cc.class_id';

这不提供准确的计数,因为对于包含多个类别关系的内容,内容行在查询响应中每个类别链接显示一次,从而夸大了类出现次数。

例如,如果内容行映射到两个类别和两个类,它将显示四次,将结果中唯一内容与类关系的实际计数加倍...

获得UNIQUE内容行所有内容类出现次数的最佳查询的最佳查询是什么?

1 个答案:

答案 0 :(得分:1)

你应该试试这个:

    SELECT count(cc.class_id) FROM (SELECT distinct cc.class_Id, COUNT(*) AS `records`
    FROM Content_Class cc
    LEFT JOIN Content c ON c.id = cc.content_id
    LEFT JOIN Content_Category ccat ON c.id = ccat.content_id
    WHERE cc.class_id IS NOT NULL
    GROUP BY cc.class_id');