MySQL 多个连接在一个查询中具有多个计数

标签 mysql sql

我有这个查询,它按预期工作

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/

相关文章:

mysql - 如何将第二个表的两个条目作为第一个表中的选择查询的两列?

mysql - Laravel 有 : Column not found

php - mysql查询和while循环创建一个特殊的字符串

sql - 从 Oracle 字符串中删除特殊字符

mysql - 使用 ORDER BY 和 CASE 帮助理解这个 mySQL 查询

php - 如何使用 Zend 链接三个 MySQL 表?

MySQL 在一个查询中需要两个不同的分组

mysql - 空间/全文/哈希索引和 MySQL 8.0.11 上的显式索引顺序使用不正确

MYSQL查询十亿条记录超时问题

sql - 带引号的字符串未正确终止