Mysql 使用GROUPBY时组合两个查询

Mysql 使用GROUPBY时组合两个查询,mysql,sql,Mysql,Sql,搞不清楚这其中的逻辑。请参见下面的两个查询: 问题1: SELECT cId, crId, COUNT(EventType) FROM Data WHERE EventType='0' OR EventType='0p' OR EventType='n' OR EventType = 'np' GROUP BY crId; 问题2: SELECT cId, crId, COUNT(EventType) AS Clicks FROM Data WHERE EventType='c' GROUP

搞不清楚这其中的逻辑。请参见下面的两个查询:

问题1:

SELECT cId, crId, COUNT(EventType)
FROM Data
WHERE EventType='0' OR EventType='0p' OR EventType='n' OR EventType = 'np'
GROUP BY crId;
问题2:

SELECT cId, crId, COUNT(EventType) AS Clicks
FROM Data
WHERE EventType='c'
GROUP BY crId;
我只是想知道是否有办法使我在查询2中得到的列出现在查询1中。因为where语句不同,所以不确定要去哪里,而且我编写的任何子查询都不起作用


提前感谢

您想在中使用

SELECT cId, crId, COUNT(EventType) as Clicks
FROM Data 

WHERE EventType IN ('0','0p','n','np','c') 
GROUP BY crId;

:)把自己放在正确的方向上;)

选择id、crid、,
计数(类型为“c”时的大小写)
然后,crid end)数一数其他人,
计数(type='c'时的大小写)
然后,crid end)计数
结核病
crid分组
;

您可以使用第二个作为相关子查询来连接这两个查询

SELECT 
  Data.cId, 
  Data.crId, 
  COUNT(EventType) AS event_type_count,
  click_counts.Clicks
FROM 
  Data
  /* Correlated subquery retrieves the Clicks (EventType 'c') per cId */
  LEFT JOIN  (
    SELECT cId, crId, COUNT(EventType) AS Clicks
    FROM Data
    WHERE EventType='c'
    GROUP BY crId
  ) AS click_count ON Data.cId = click_count.cId AND Data.crId = click_count.crId
/* OR chain replaced with IN() clause */
WHERE Data.EventType IN ('0','0p','n','np')
/* This GROUP BY should probably also include Data.cId... */
GROUP BY Data.crId;

您可以使用
CASE
语句从表中一次完成所有查询

SELECT  cId, crId, 
        SUM(CASE WHEN EventType IN ('0', '0p', 'n', 'np') THEN 1 ELSE 0 END) as events,
        SUM(CASE WHEN EventType = 'c' THEN 1 ELSE 0 END) as clicks
FROM    Data
WHERE   EventType IN ('0', '0p', 'n', 'np', 'c')
GROUP BY crId;

通过UNION语句组合查询是可能的,为什么不在第一个查询中添加或EventType='c'!!谢谢大家!学习了一些有趣的东西。总共应该有4个字段。一个计数(EventType),对0、0p、n和np的所有出现次数进行计数。然后是另一个列计数(EventType),它统计c的所有出现次数。这有意义吗?这不是OP的意思wants@JonHagelin哦,好吧,第一印象欺骗了我;)对不起。@JonHagelin我说对了;)无论如何,这是一个很好的问题+1。如果系统中有许多其他类型,而不是您在此指出的类型,则可以添加最后一个带有in的
where子句。在mys示例表中,我只使用了这些。。所以没什么区别。我只是把这个加在我的答案上。但是您不应该需要
WHERE
子句。@Michael-我将
WHERE
子句保留在中,因为我不确定是否有任何其他事件类型被排除。如果这些都是正确的事件类型,则可以完全删除WHERE子句。但是,由于这两种情况中未列出的事件类型都会导致0,因此不会对它们进行计数。没错,无论哪种情况,结果都是相同的。我通常更喜欢过滤掉我不打算看的记录,希望性能更好。但是,由于不知道数据的外观、索引等,很难说哪种方法更有效。谢谢!我不确定是否应该声明它是什么表,因为我只使用了1个表。我应该一直这样做吗?@JonHagelin在
SELECT
列表中引用哪个表并不重要,因为这两个列都是公共的,但必须包含主表或子查询别名,以避免歧义。对于所有的新问题,我很抱歉,我只是想了解逻辑,以备将来使用,但是为什么我们在from中执行子查询而不是select?第一个选择中的“点击”到底是什么?你不应该做交叉连接吗?对于不同的
WHERE
子句,我们可以假设两个查询的CID是不相交的。@JonHagelin我在别名中输入了
click\u counts。单击
使其更为明显-
单击
在该上下文中是子查询返回的值。在
SELECT
列表中执行子查询会导致对每一行执行子查询,速度非常慢。这样,查询只执行一次,结果(可能存储在临时表中)与外部查询关联。它通常要快得多。
SELECT cId, crId, 
SUM(CASE WHEN EventType='0' OR EventType='0p' OR EventType='n' OR EventType = 'np' THEN 1 ELSE 0 END) AS Count_1,
SUM(CASE WHEN EventType='c' THEN 1 ELSE 0 END) AS Count_2
FROM Data
WHERE EventType IN ('0','0p','n','np','c')
GROUP BY crId;
SELECT  cId, crId, 
        SUM(CASE WHEN EventType IN ('0', '0p', 'n', 'np') THEN 1 ELSE 0 END) as events,
        SUM(CASE WHEN EventType = 'c' THEN 1 ELSE 0 END) as clicks
FROM    Data
WHERE   EventType IN ('0', '0p', 'n', 'np', 'c')
GROUP BY crId;