如何将两个MySQL查询的结果合并为一个?

如何将两个MySQL查询的结果合并为一个?,mysql,Mysql,假设我有一张这样的桌子: SELECT name, SUM(CASE WHEN (arrive_time BETWEEN '2018-09-07 00:00:00' AND '2018-09-07 23:59:59') THEN 1 ELSE 0 END) AS day_count_2018_09_07, SUM(CASE WHEN (arrive_time BETWEEN '2018-09-01 00:00:00' AND '2018-09-30 23:59:59') THEN 1

假设我有一张这样的桌子:

SELECT
  name,
  SUM(CASE WHEN (arrive_time BETWEEN '2018-09-07 00:00:00' AND '2018-09-07 23:59:59') THEN 1 ELSE 0 END) AS day_count_2018_09_07,
  SUM(CASE WHEN (arrive_time BETWEEN '2018-09-01 00:00:00' AND '2018-09-30 23:59:59') THEN 1 ELSE 0 END) AS month_count_2018_09
FROM
    data_table
GROUP BY
    name;
我如何计算每个人在2018-09-07日发生的数据数量,以及每个人在2018-09月发生的数据数量

我的意思是我想创建一个如下表:

SELECT
  name,
  SUM(CASE WHEN (arrive_time BETWEEN '2018-09-07 00:00:00' AND '2018-09-07 23:59:59') THEN 1 ELSE 0 END) AS day_count_2018_09_07,
  SUM(CASE WHEN (arrive_time BETWEEN '2018-09-01 00:00:00' AND '2018-09-30 23:59:59') THEN 1 ELSE 0 END) AS month_count_2018_09
FROM
    data_table
GROUP BY
    name;
我知道

SELECT 
  name, 
  COUNT(*) AS day_count_2018_09_07
FROM data_table
WHERE 
  arrive_time >= '2018-09-07 00:00:00'
  AND
  arrive_time <= '2018-09-07 23:59:59'
GROUP BY name;
可以为每个人生成2018-09-07日发生的数据数量,以及

SELECT 
  name, 
  COUNT(*) AS month_count_2018_09
FROM data_table
WHERE 
  arrive_time >= '2018-09-01 00:00:00'
  AND
  arrive_time <= '2018-09-30 23:59:59'
GROUP BY name;
可以为每个人生成2018-09月发生的数据数量

但我不知道如何组合上述两个查询,以便在一个查询中创建day_count_2018_09_07和month_count_2018_09列


这里是您可以直接获取我问题中数据的地方。

您可以使用条件聚合从同一查询中获取两个结果:

SELECT name, 
   SUM(CASE WHEN SUBSTR(DATE(arrive_time),1,7)='2018-09' THEN 1 ELSE 0 END) AS month_count_2018_09,
   SUM(CASE WHEN DATE(arrive_time)='2018-09-07' THEN 1 ELSE 0 END) AS day_count_2018_09_07
FROM data_table
GROUP BY name
输出:

name    month_count_2018_09     day_count_2018_09_07
Ben     3                       0
Jane    1                       1
John    3                       2

试着这样组合它们:

Select DayCounter.name, DayCounter.day_count_2018_09_07, MonthCounter.month_count_2018_09
from
(SELECT 
  name, 
  COUNT(*) AS day_count_2018_09_07
FROM data_table
WHERE 
  arrive_time >= '2018-09-07 00:00:00'
  AND
  arrive_time <= '2018-09-07 23:59:59'
GROUP BY name) as DayCounter
Inner Join
(SELECT 
  name, 
  COUNT(*) AS month_count_2018_09
FROM data_table
WHERE 
  arrive_time >= '2018-09-01 00:00:00'
  AND
  arrive_time <= '2018-09-30 23:59:59'
GROUP BY name) as MonthCounter

On DayCounter.name = MonthCounter.name

像这样的东西怎么样:

SELECT
  name,
  SUM(CASE WHEN (arrive_time BETWEEN '2018-09-07 00:00:00' AND '2018-09-07 23:59:59') THEN 1 ELSE 0 END) AS day_count_2018_09_07,
  SUM(CASE WHEN (arrive_time BETWEEN '2018-09-01 00:00:00' AND '2018-09-30 23:59:59') THEN 1 ELSE 0 END) AS month_count_2018_09
FROM
    data_table
GROUP BY
    name;

谢谢你提供小提琴。如果所有的MySQL问题都有一个…谢谢。您的答案是最优雅的。您仍然可以进行改进,将子数据到达时间1,7='2018-09'替换为日期到达时间,%Y-%m='2018-09'