2016-11-24 97 views
3

这似乎是一件容易的事情,但我的基本sql知识让我失望,因为我还在学习。将按日期分组的两条select语句组合起来,返回两列数据

基本上,我想结合:

SELECT DATE(created) DATE, COUNT(DISTINCT created) newpost FROM surveys 
WHERE created >= Last_day(CURRENT_DATE) + INTERVAL 1 DAY - INTERVAL 1 MONTH 
AND created < last_day(CURRENT_DATE) + INTERVAL 1 DAY GROUP BY DATE(created); 

SELECT DATE(TIMESTAMP) DATE,subs FROM trafficstats 
WHERE TIMESTAMP >= LAST_DAY(CURRENT_DATE) + INTERVAL 1 DAY - INTERVAL 1 MONTH 
AND TIMESTAMP < LAST_DAY(CURRENT_DATE) + INTERVAL 1 DAY; 

成一个查询,将返回数据,按日期分组,分为两个附加列 - newpostssubs

我试过用UNION,这似乎没有给我我想要的输出。它将数据合并成一列(newpost),也没有按日期分组。

我还是相当新的写MySQL查询,我试过寻找答案无济于事。希望能在这里找到比我更聪明的人的知识。

+0

能否请你创建你有什么简单的最小数据视图和你所期望的结果是什么?因为如你所说,这两个查询有1个共同的字段'DATE'和两个不同的字段'newpost'和'subs'。因此,如果将这两个查询结合起来,这是否意味着来自第一个查询的记录将全部具有空的“subs”字段,而来自第二个查询的记录都将具有空的'newpost'字段? – EhsanT

回答

1

你可以使用JOIN

select t1.DATE, t1.newpost, t2.subs 
    from (
     SELECT DATE(created) DATE, COUNT(DISTINCT created) newpost 
     FROM surveys 
     WHERE created >= Last_day(CURRENT_DATE) + INTERVAL 1 DAY - INTERVAL 1 MONTH 
     AND created < last_day(CURRENT_DATE) + INTERVAL 1 DAY 
     GROUP BY DATE(created) 
    ) t1 
    left join (
     SELECT DATE(TIMESTAMP) DATE, subs 
     FROM trafficstats 
     WHERE TIMESTAMP >= LAST_DAY(CURRENT_DATE) + INTERVAL 1 DAY - INTERVAL 1 MONTH 
     AND TIMESTAMP < LAST_DAY(CURRENT_DATE) + INTERVAL 1 DAY 
    ) t2 on t1.DATE = t2.DATE 
+0

这适用于我的需求。 –

1

我猜你想要每个不同的日期一行,显示了两个不同的计数值。

这种查询比起初看起来稍微有点诡异,因为这两个摘要查询可能有不同的日期集合。

所以你需要开始一个产生所有可能的利息日期的子查询。然后,您需要将每个摘要查询左连接到它。您必须使用LEFT JOIN而不是普通的内部JOIN,因为当LEFT JOIN不匹配来自左侧的任何行时,LEFT JOIN不会抑制连接右侧的行。

这里有:

所有的日期。请注意0​​操作是一个精简(重复删除)联合操作。

  SELECT DISTINCT DATE(created) DATE FROM newpost 
      WHERE created >= Last_day(CURRENT_DATE) + INTERVAL 1 DAY - INTERVAL 1 MONTH 
       AND created < last_day(CURRENT_DATE) + INTERVAL 1 DAY 
      UNION 
      SELECT DISTINCT DATE(TIMESTAMP) DATE FROM trafficstats 
      WHERE TIMESTAMP >= LAST_DAY(CURRENT_DATE) + INTERVAL 1 DAY - INTERVAL 1 MONTH 
       AND TIMESTAMP < LAST_DAY(CURRENT_DATE) + INTERVAL 1 DAY 

然后你需要你的两个总结子查询。第一个是这个。请注意,我将COUNT(DISTINCT created)更改为COUNT(*),因为我不明白DISTINCT背后的逻辑。你可以有多个单行的单个帖子;你用时间戳告诉他们吗?如果你对每个帖子有一排你应该COUNT(*)

  SELECT DATE(created), COUNT(*) newposts 
      FROM newpost 
      GROUP BY DATE(created) 

第二摘要是这样的。我再次计算行数。

  SELECT DATE(TIMESTAMP), COUNT(*) subs 
      FROM trafficstats 
      GROUP BY DATE(TIMESTAMP) 

最后,像这样加入这三个子查询。您将从第一个子查询中获取日期,并从后两个子查询中获取按日期分类的摘要信息。

 SELECT dates.DATE, posts.newposts, subs.subs 
     FROM (/* date subquery */) dates 
     LEFT JOIN (/* posts subquery */) posts ON dates.DATE = posts.DATE 
     LEFT JOIN (/* subs subquery */) subs ON dates.DATE = subs.DATE 
     ORDER BY dates.DATE 

全部放在一起:

 SELECT dates.DATE, posts.newposts, subs.subs 
     FROM (
      SELECT DISTINCT DATE(created) DATE FROM newpost 
      WHERE created >= Last_day(CURRENT_DATE) + INTERVAL 1 DAY - INTERVAL 1 MONTH 
       AND created < last_day(CURRENT_DATE) + INTERVAL 1 DAY 
      UNION 
      SELECT DATE(TIMESTAMP) DATE FROM trafficstats 
      WHERE TIMESTAMP >= LAST_DAY(CURRENT_DATE) + INTERVAL 1 DAY - INTERVAL 1 MONTH 
       AND TIMESTAMP < LAST_DAY(CURRENT_DATE) + INTERVAL 1 DAY 
      ) dates 
     LEFT JOIN (
       SELECT DATE(created), COUNT(*) newposts 
        FROM newpost 
       GROUP BY DATE(created) 
      ) posts ON dates.DATE = posts.DATE 
     LEFT JOIN (
        SELECT DATE(TIMESTAMP), COUNT(*) subs 
        FROM trafficstats 
        GROUP BY DATE(TIMESTAMP) 
      ) subs ON dates.DATE = subs.DATE 
     ORDER BY dates.DATE 
+0

我需要的结果是按日期分组的一行,新帖子数量的列和子数量的列。好消息是两个表之间的所有日期都匹配,所以它不应该由于空值而丢失任何数据。 –