如何使ID级别的WHERE子句限制动态化

时间:2019-04-15 21:50:04

标签: mysql sql count where-clause

我想创建一个WHERE子句,其中的限制是动态变化的,具体取决于ID和所要查找的日期,以便对一个表中ID级别上的行数进行计数,并将其带入另一表中:

表A看起来像这样,有几个ID:

ID - Create date
12221 - 12/12/2018
13331 - 12/10/2018

表B具有以下信息以及多个ID

ID - Date
12221 - 10/10/2018
12221 - 07/06/2017
13331 - 01/20/2019

我现在想对表2中所有具有ID日期的行进行计数。因此,在上面的示例中,它应该显示:

ID - Count
12221 - 2
13331 - 0

不确定如何在SQL中使用WHERE子句进行操作。我可以将“创建日期”作为表B中的新列引入,并对此进行变通(例如,如果日期小于创建日期,则为1,如果日期大于创建日期,则为0),然后将其放入WHERE子句中,但是由于我有大量数据,所以这不是理想的解决方案。

谢谢!

5 个答案:

答案 0 :(得分:1)

加入表并按日期条件分组:

select b.id, sum(a.createdate is not null) count
from tableb b left join tablea a
on a.id = b.id and b.date < a.createdate
group by b.id

请参见demo
结果:

| id    | count |
| ----- | ----- |
| 12221 | 2     |
| 13331 | 0     |

答案 1 :(得分:0)

您需要从TableA中选择所有记录,并在TableB中选择其日期早于TableA中的日期的记录数:

CREATE TEMPORARY TABLE TableA (ID INT, CreateDate DATETIME);
INSERT INTO TableA VALUES (12221, '2018-12-12'), (13331, '2018-10-12');

CREATE TEMPORARY TABLE TableB (ID INT, DDate DATETIME);
INSERT INTO TableB VALUES (12221, '2018-10-10'), (12221, '2017-06-07'), (13331, '2019-01-20');

SELECT  a.ID,
        COUNT(b.ID) AS MatchCount
  FROM  TableA a
    LEFT JOIN TableB b ON b.ID = a.ID AND b.DDate < CreateDate
  GROUP BY ID;

DROP TABLE TableA;
DROP TABLE TableB;

请注意,在我的示例中,我将date列从TableB重命名为DDate

输出:

ID      MatchCount
12221   2
13331   0

在上述SQL中,使用TableB必须相等且日期必须在创建日期之前 的条件将TableA连接到ID 。通过计算从TableB返回的符合此条件的行数来构建结果集。

答案 2 :(得分:0)

这应该给您id中的每个TableA和所需的计数:

SELECT a.id, COUNT(b.id) AS preSignupEntries
FROM TableA AS a
LEFT JOIN TableB AS b ON a.id = b.id AND a.`Create date` > b.`Date`
GROUP BY a.id;

COUNT与大多数聚合函数一样,将忽略NULL值。

编辑:假定您的“日期”字段实际上是日期数据类型;如果要将它们存储为字符串,则需要进行一些解析。

Edit2:如果您实际上并不关心没有早于TableB条目的TableA条目,则使用INNER JOIN可能会稍快一些。

答案 3 :(得分:0)

select a.id, IFNULL((select count(b.id)
from tableb b 
where a.id = b.id and b.date < a.createdate
group by b.id ),0) as total
from tablea a

对于这种情况,您在表a中有一行,但在表b中没有一行:

  • IFNULL函数仅适用于mysql。

表a

ID - Create date
12221 - 12/12/2018
13331 - 12/10/2018
13336 - 12/10/2018

表b

ID - Date
12221 - 10/10/2018
12221 - 07/06/2017
13331 - 01/20/2019

结果

ID      MatchCount
12221   2
13331   0
13336   0

答案 4 :(得分:-1)

尝试       Select id,Count(id) From TableB Group By ID