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

MYSQL:从多个表返回多个计数,mysql,sql,join,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 ORD

我试图从多个表返回多个计数。以下是我必须从同一个表返回的多个计数,非常感谢这里的帮助:

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=打开。邮件收件人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
这根本不对


谢谢。

我不太确定我是否理解您在第二次查询中试图计算的内容,但您应该能够调整这一点。其思想是创建多个表子查询,这些表子查询的键为mailling_name,以及您想要的任何计数/聚合值……并在mailling_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\u name\u id或sort,请连接到mailing name上的表并获取所需的字段

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

加:

此查询的更通用的结构

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语句只从一个表中获取键,然后从任何其他数据库的子查询中获取其余的计数值,这个查询将返回一个错误,因为GROUPBY语句…MySQL喜欢做错误的事情而不提供错误。将count查询分开,并在最后连接它们。我不理解的部分是,当m是邮件名称表时,在第一行中使用a和b。就我想数的数字而言,我试图通过查看打开的电子邮件数量和这些电子邮件中的点击次数来确定三种电子邮件类型中哪一种最有效,这就是为什么有一个open_id和open_type_id。谢谢。A和B是我使用的子查询的别名。也许可以快速查找子查询和别名相同的想法,您调用了一个表'm'…我调用了一个子查询'a'。例如:从select*from table ta中选择一个*-在这里,我从表中选择并将其别名为t,然后我调用该子查询,将其别名为“a”,并从中选择一个*。希望helpsI能提供一个更通用的查询版本……请编写三个单独的计数查询,返回“mailing_name”键,然后返回所需的计数。将这三个单独的查询转换为子查询,将它们连接在一起,然后从中选择所需的计数谢谢。我还没有完全把它用上,但我正在努力。这一切更有意义。这是一个愚蠢的问题,但你知道我如何才能获得打开和点击返回?是不是在邮件收件人的id不为空的地方填充了一个id,然后就打开了?然后,它只是通过邮寄地址(字段不为null)进行计数:从邮寄地址接收者开放地址id不为null的表中选择邮寄地址(名称),count1;我假设点击返回基本上是一样的