按第三张表条件过滤的两张表的分组计数查询

时间:2019-05-24 14:19:40

标签: sql

我有三个表:类别,邮件和分类。在此SQLFiddle中概述了表之间的关系,并提供了一些示例数据:http://sqlfiddle.com/#!9/118b24/3/0

CREATE TABLE `Category` (
  `id` int(6) unsigned NOT NULL,
  `name` varchar(20) NOT NULL,
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;

CREATE TABLE `Mail` (
  `id` int(6) unsigned NOT NULL,
  `content` varchar(500) NOT NULL,
  `date` datetime NOT NULL,  
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;


CREATE TABLE `Classification` (
  `id` int(6) unsigned NOT NULL,
  `mail_id` int(6) unsigned NOT NULL,
  `category_id` int(6) unsigned NOT NULL,
  FOREIGN KEY (mail_id) REFERENCES Mail(id),
  FOREIGN KEY (category_id) REFERENCES Category(id),
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;

我首先运行查询以获取分配给每个类别的电子邮件计数:

SELECT Category.name, count(Classification.category_id) FROM Category LEFT OUTER JOIN Classification ON Classification.category_id = Category.id GROUP BY Category.name 

哪个工作正常。

但是我现在想基于Email集合中的日期添加一个过滤器。如果我加入了过滤器集合:

SELECT Category.name, count(Classification.category_id) FROM Category JOIN Mail ON Mail.date < '2019-03-24' LEFT OUTER JOIN Classification ON Classification.category_id = Category.id GROUP BY Category.name 

但是现在计数仅增加了一倍,而且似乎没有应用过滤器。过滤器为什么不起作用,我应该怎么做才能解决它?

1 个答案:

答案 0 :(得分:1)

您需要一个JOINClassification之间的Mail条件:

SELECT ca.name, count(cl.category_id)
FROM Category LEFT JOIN
     Classification cl
     ON cl.category_id = c.id LEFT JOIN
     Mail m
     ON m.id = cl.mail_id AND  -- your JOIN key goes here
        m.date < '2019-03-24'
GROUP BY c.name ;