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中