MYSQL:从多个表返回多个计数

标签 mysql sql join

我正在尝试从多个表返回多个计数。这是我必须从同一个表返回多个计数的内容(非常感谢这里的帮助):

SELECT
     m.mailing_name AS Mailing_Name,
    COUNT(mr.mailing_recipient_id) AS Total_Recipients
FROM mailing_recipient mr 
INNER JOIN mailing m
ON mr.mailing_id = m.mailing_id
GROUP BY m.mailing_name
ORDER BY m.mailing_name;

这将返回每种电子邮件类型的收件人数量。我希望创建一个脚本,同时返回上述内容以及每种电子邮件类型的电子邮件打开总数和每个收件人打开的电子邮件数量。

附加表是 mailing_recipient_open,其中 mailing_recipient_open_id 充当打开/点击的标识符,mailing_recipient_open_type_id 指示每个记录是充当打开还是点击(1=点击,2=打开)。 mailing_recipient_id 充当表之间的外键。

这是我能得到的最接近的结果。我非常喜欢上述格式,因为它更干净,但我不知道我是否能够按照描述加入。

SELECT
mailing_name,
mr.mailing_recipient_id,
mailing_recipient_open_id,
COUNT( mr.mailing_recipient_id ) AS Total_recipient,
mailing_recipient_open_id AS open_click

FROM mailing m

LEFT OUTER JOIN mailing_recipient mr ON m.mailing_id = mr.mailing_id
LEFT OUTER JOIN mailing_recipient_open mc ON mr.mailing_recipient_id = mc.mailing_recipient_id

GROUP BY mailing_name;

我的输出如下所示:

mailing_name    mailing_recipient_id    mailing_recipient_open_id    Total_recipient    Open_click
Mailing A       1                       NULL                         203234             NULL
Mailing B       22342                   12342                        123948             8738
Mailing C       12322                   NULL                         145203             NULL

这根本不对。

谢谢。

最佳答案

我不太确定我是否理解您在第二个查询中尝试计算的内容,但您应该能够适应这一点。这个想法是创建几个以 mailing_name 作为键以及您想要的任何计数/聚合值的表(子查询)...并将它们全部连接到该 mailing_name 键上

select a.mailing_name, a.totalrecipients, b.counter
from
(SELECT
 m.mailing_name AS Mailing_Name,
COUNT(mr.mailing_recipient_id) AS Total_Recipients
FROM mailing_recipient mr 
INNER JOIN mailing m
ON mr.mailing_id = m.mailing_id
GROUP BY m.mailing_name
)a
left join
(select mailing_name, count(*) as counter
 from tableforcounting 
group by mailing_name)b
on a.mailing_name = b.mailing_name
    ORDER BY m.mailing_name

只要它们按相同的 mailing_name 键分组,您就可以继续将它们链接在一起以获得尽可能多的其他计数。如果您想要常规字段(例如 mailing_name_id 或排序),请加入到邮寄名称表并获取您想要的字段。

希望这是有道理的,如果您需要,我可以澄清;)

添加:

此查询的更通用结构...

select a.groupingname, a.count, b.count, c.count, etc...
from
(select  groupingname, count(1) as count from table t group by  groupingname) a
left join
(select  groupingname, count(1) as count from differnt_table t where open = 1 group by  groupingname) b    
on a.groupingname = b.groupingname
left join
(select  grouping name, count(1) as count from 3rdtable t) c
on a.groupingname = c.groupingname

看看它是如何构成一系列子查询的,每个子查询返回一个要连接的键以及一个计数值...然后 select 语句仅从一个表中获取键,然后从子查询中获取其余的计数值?

关于MYSQL:从多个表返回多个计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25025835/

相关文章:

c# - MySQL 查询中缺少关键错误

MySQL Join 即使没有匹配的数据

sql - 如何使用不同的子查询在表中插入多行

mysql - 如何在 MySQL 中存储键值对?

php - 从 mysql 中获取列名和行数据并创建 json

mysql - 无法在纯 ubuntu 20.04 上安装 mysql

sql - Postgres/netezza 从多个表进行多重连接

mysql - 对于一对多关系,如果表 B 没有引用 A 的某些行,如何获取表 A 的每一行?

mysql - 选择MySQL中第二高的值

mysql - mysql 中的条件连接