Mysql 关于用UNION连接的几个表之间的计算

Mysql 关于用UNION连接的几个表之间的计算,mysql,sql,database,join,select,Mysql,Sql,Database,Join,Select,我有一个困难的查询,现在我需要将这个查询的结果从另一个表中分离出来。过去的工会。是这样吗?为什么我不工作 SELECT * from (select IFnull(t.diapason,'total') as diapason, count(distinct user_id) / total_visitors*100 AS 'percent_of_users' FROM (SELECT p.user_id, p.amount as total, CASE when amount<1

我有一个困难的查询,现在我需要将这个查询的结果从另一个表中分离出来。过去的工会。是这样吗?为什么我不工作

SELECT * from (select IFnull(t.diapason,'total') as diapason, count(distinct 
user_id) / total_visitors*100 AS 'percent_of_users'
FROM 
(SELECT p.user_id, p.amount as total, CASE  
when amount<10 then '0-10' 
when amount>=10 then '10 +' END AS diapason
FROM 
    (SELECT payments.user_id, SUM(amount) AS amount 
    FROM payments INNER JOIN 
   (SELECT DISTINCT user_id, login_time FROM activity where login_time 
between '2018-04-12' and '2018-04-18') a 
ON payments.user_id = a.user_id and a.login_time = payments.payment_time 
GROUP BY payments.user_id) p
) t
  GROUP BY diapason WITH ROLLUP) as t1

UNION
SELECT COUNT(distinct user_id) as total_visitors FROM activity where 
login_time between '2018-04-12' and '2018-04-18'
ORDER BY percent_of_users desc;
计算访客百分比(activity.user\u id的新值/activity.user\u id的旧值)


但我不知道如何获得旧的价值。你能给我一些提示吗?

你正试图用这种模式做一些事情

 SELECT a, b, c FROM tbl 
 UNION
 SELECT d FROM tbl

你不能那样做™. 联合中的两个结果集必须具有相同的列数,并且每个结果集中的每一列都必须是相同的数据类型。

您正在尝试使用这种模式

 SELECT a, b, c FROM tbl 
 UNION
 SELECT d FROM tbl

你不能那样做™. 联合中的两个结果集必须具有相同的列数,并且每个结果集中的每一列必须具有相同的数据类型。

从工作查询开始

SELECT ifnull(t.diapason,'total') as diapason,
   COUNT(DISTINCT user_id) AS user_count
FROM ...
您可以在子查询中包含
总访客数

SELECT ifnull(t.diapason,'total') as diapason,
  COUNT(DISTINCT user_id) * 100 /
     (SELECT COUNT(distinct user_id) 
      FROM activity WHERE ...) as percent_of_users
FROM (...) t
GROUP BY diapason WITH ROLLUP
ORDER BY percent_of_users DESC
或者,您可以使用
连接
(更接近您想要的查询结构):

我使用您的别名
t1
t
来标记查询的哪个部分属于哪里

在这两种情况下,总计数只计算一次,但是MySQL执行这两个查询的方式略有不同(虽然不会有太大影响)。您可能希望包含一个计数为
0
(从而除以
0
)的检查,尽管这里不应该这样做


备注:对于MySQL 8+,如果使用A,您可以简化(并澄清)您的代码,因为您目前基本上重复子查询
A
的代码两次(一次在实际查询中,一次在总计数的计算中),如果它比从工作查询开始的简单的
where

更复杂,那么它会变得烦人和混乱

SELECT ifnull(t.diapason,'total') as diapason,
   COUNT(DISTINCT user_id) AS user_count
FROM ...
您可以在子查询中包含
总访客数

SELECT ifnull(t.diapason,'total') as diapason,
  COUNT(DISTINCT user_id) * 100 /
     (SELECT COUNT(distinct user_id) 
      FROM activity WHERE ...) as percent_of_users
FROM (...) t
GROUP BY diapason WITH ROLLUP
ORDER BY percent_of_users DESC
或者,您可以使用
连接
(更接近您想要的查询结构):

我使用您的别名
t1
t
来标记查询的哪个部分属于哪里

在这两种情况下,总计数只计算一次,但是MySQL执行这两个查询的方式略有不同(虽然不会有太大影响)。您可能希望包含一个计数为
0
(从而除以
0
)的检查,尽管这里不应该这样做


备注:对于MySQL 8+,如果使用A,您可以简化(并澄清)您的代码,因为您目前基本上重复子查询
A
的代码两次(一次在实际查询中,一次在总计数的计算中),如果它比简单的
更复杂,那么它可能会变得烦人和混乱,其中

错误消息(您实际上应该包括)已经告诉您这里出了什么问题:在
联合中,所有部分都需要有相同数量的列。至于如何修复它:不清楚您正在尝试做什么(“现在我需要从另一个表中分离此查询数据的结果”),因此您可以对此进行详细说明,最好使用示例数据,例如两个部分的一些行(在执行
联合之前)以及基于这些行的预期结果(以了解“分离”是什么)应该这样做,因为您似乎根本不确定这是否是通过
联盟完成的。@solarflar您的评论包含了答案。为什么不写一个答案?@O.Jones实际的问题似乎是“这是对的吗?”,我也不确定他想要实现什么(虽然我很确定
联合
是不正确的,但看起来他更需要一个
加入
或子查询)。请提供示例数据和所需结果。@Gordon Linoff,你好!我更新了所需结果错误消息(您实际上应该包括)已经告诉您这里的错误:在
联合中,所有部分都需要具有相同数量的列。至于如何修复它:不清楚您正在尝试做什么(“现在我需要从另一个表中分离此查询数据的结果”),因此您可以对此进行详细说明,最好使用示例数据,例如两个部分的一些行(在执行
联合之前)以及基于这些行的预期结果(以了解“分离”是什么)应该这样做,因为您似乎根本不确定这是否是通过
联盟完成的。@solarflar您的评论包含了答案。为什么不写一个答案?@O.Jones实际的问题似乎是“这是对的吗?”,我也不确定他想要实现什么(虽然我很确定
联合
是不正确的,但看起来他更需要一个
加入
或子查询)。请提供示例数据和所需结果。@Gordon Linoff,你好!我想可能还有别的办法吗?(我更新了任务)可能还有其他方法吗?(我更新了任务)谢谢你的帮助!它给了我正确的想法)我已经改变了我的代码。只有一个问题:它在群体上的划分是错误的。总的百分比是正确的。根据我的任务,如果用户id由于他曾经支付的款项而在表中,则必须划分组。但是,当我提出这个问题时,我认为由于他的分期付款,我开始对组进行划分。我更新了下面有问题的代码。请观看@ааааааааааааааааааааааааа。所以,问一个新的问题,这没有问题,实际上鼓励保持问题“干净”。包括一些示例数据(输入、您得到的结果、您想要的结果),并尝试将其减少到所需的最小值(
t1
?),例如,您可以省去与
total\u访问者相关的部分,因为您(希望)现在知道如何将其包括到更改后的code.pl中