我想创建一个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子句中,但是由于我有大量数据,所以这不是理想的解决方案。
谢谢!
答案 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中没有一行:
ID - Create date
12221 - 12/12/2018
13331 - 12/10/2018
13336 - 12/10/2018
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