我有一个困难的查询,现在我需要将此查询的结果除以另一个表中的数据。使用联合。这样对吗?为什么我不工作?
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;
我做了 UNION 因为我需要获得total_visitors。
谢谢!
结果
diapason percent_of_visitors
0-10 ...%
10+ ...%
计算percent_of_visitors(activity.user_id的新值/activity.user_id的旧值)。
但我不知道如何访问旧值。你能给我提示吗?
最佳答案
从您的工作查询开始
SELECT ifnull(t.diapason,'total') as diapason,
COUNT(DISTINCT user_id) AS user_count
FROM ...
您可以将 total_visitors
包含在子查询中:
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
或者,您可以使用join
(它更接近您想要的查询结构):
SELECT t1.diapason,
t1.user_count * 100 / tv.total_users as percent_of_users
FROM ( SELECT ifnull(t.diapason,'total') as diapason,
COUNT(distinct user_id) AS user_count
FROM ...
) as t1
CROSS JOIN (SELECT COUNT(distinct user_id) as total_visitors
FROM activity WHERE ...) as tv
ORDER BY percent_of_users DESC
我使用您的别名 t1
和 t
来标记您的查询的哪一部分属于何处。
在这两种情况下,总计数只会计算一次,不过,MySQL 执行这两个查询的方式略有不同(不过应该不会产生太大影响)。您可能希望包含对 0
计数的检查(因此除以 0
),尽管这种情况不应在此处发生。
备注:对于 MySQL 8+,如果使用 cte ,则可以稍微简化(并澄清)代码。 ,因为您目前基本上重复子查询 a
的代码两次(一次在实际查询中,一次在计算总计数中),如果它比简单的更复杂,这可能会变得烦人和困惑哪里
。
关于mysql - 关于用UNION连接的几个表之间的计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52201125/