我有这个查询,它按预期工作
SELECT i0_.address AS address0, COUNT(d1_.id) AS sclr2
FROM IP i0_
LEFT JOIN Date_IP d3_ ON i0_.id = d3_.ip
LEFT JOIN Date d1_ ON d1_.id = d3_.date
GROUP BY i0_.address
ORDER BY sclr2 DESC
此查询也按预期工作:
SELECT i0_.address AS address0, COUNT(u2_.id) AS sclr3
FROM IP i0_
LEFT JOIN IP_UserAgent i4_ ON i0_.id = i4_.ip
LEFT JOIN UserAgent u2_ ON u2_.id = i4_.useragent
GROUP BY i0_.address
ORDER BY sclr3 DESC
但是我怎样才能将这两者合二为一呢?
我试过了
SELECT i0_.address AS address0, COUNT(d1_.id) AS sclr2, COUNT(u2_.id) AS sclr3
FROM IP i0_
LEFT JOIN Date_IP d3_ ON i0_.id = d3_.ip
LEFT JOIN Date d1_ ON d1_.id = d3_.date
LEFT JOIN IP_UserAgent i4_ ON i0_.id = i4_.ip
LEFT JOIN UserAgent u2_ ON u2_.id = i4_.useragent
GROUP BY i0_.address
ORDER BY sclr2 DESC
在这种情况下,值 sclr2 是正确的,但 sclr3 与 sclr2 相同。请问我做错了什么?
最佳答案
您可以通过将它们设为子查询来组合它们:
SELECT t1.address0, t1.sclr2, t2.sclr3
FROM (SELECT i0_.address AS address0, COUNT(d1_.id) AS sclr2
FROM IP i0_ LEFT JOIN
Date_IP d3_ ON i0_.id = d3_.ip LEFT JOIN
Date d1_
ON d1_.id = d3_.date
GROUP BY i0_.address
) t1 JOIN
(SELECT i0_.address AS address0, COUNT(u2_.id) AS sclr3
FROM IP i0_ LEFT JOIN
IP_UserAgent i4_
ON i0_.id = i4_.ip LEFT JOIN
UserAgent u2_
ON u2_.id = i4_.useragent
GROUP BY i0_.address
) t2
on t1.address0 = t2.address0;
正如另一个答案中提到的,count(distinct)
也可以工作。但是,它生成一个中间表,该中间表是“日期”和“用户代理”的笛卡尔积。因此,如果有 100 个日期和 100 个用户代理,中间表将有 10,000 行 - 如果您的数据有很多这样的示例,那么处理时间和中间存储要求可能会变得过高。
关于MySQL 多个连接在一个查询中具有多个计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23272937/