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

标签 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<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

我使用您的别名 t1t 来标记您的查询的哪一部分属于何处。

在这两种情况下,总计数只会计算一次,不过,MySQL 执行这两个查询的方式略有不同(不过应该不会产生太大影响)。您可能希望包含对 0 计数的检查(因此除以 0),尽管这种情况不应在此处发生。

备注:对于 MySQL 8+,如果使用 cte ,则可以稍微简化(并澄清)代码。 ,因为您目前基本上重复子查询 a 的代码两次(一次在实际查询中,一次在计算总计数中),如果它比简单的更复杂,这可能会变得烦人和困惑哪里

关于mysql - 关于用UNION连接的几个表之间的计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52201125/

相关文章:

php - 如何从mysql中提取列名和php中的条目,列名只显示一次

mysql - 如何在 MySQL 中返回数据透视表输出?

mysql - SQL SELECT LIKE(不区分大小写)

c++ - MySQL,C++ : Retrieving auto-increment ID

mysql - 内部连接两个表

MySQL:尝试为 root 设置密码,SQL 语法错误

php - 使用 php 将 mysql 数据库连接到主机

mysql - 用于分析的共享极光编写器导致生产中的锁定等待超时

php - adduser_process.php 不向 MySQL 表中添加信息

mysql - SQLAlchemy 相交错误