替换 MySQL 中的联合

Posted

技术标签:

【中文标题】替换 MySQL 中的联合【英文标题】:Replacing a union in MySQL 【发布时间】:2020-12-13 13:58:01 【问题描述】:

我正在尝试检索每月进行购买的唯一身份用户的数量。这听起来很简单,但这里的问题是我们有三种类型的产品,并且这些产品的购买在不同的表中,其中唯一的公共键是 user_id,所以为了找出唯一用户,我必须查询这三个表分别合并结果并执行不同的计数。

这是我现在正在做的一个例子:

SELECT
    month,
    count(distinct user_id) as users
FROM
( 
SELECT  
    DATE_FORMAT(purchase_date,’%Y-%m) as month, 
    user_id 
FROM purchases_a

UNION

SELECT  
    DATE_FORMAT(purchase_date,’%Y-%m) as month, 
    user_id 
FROM purchases_b

UNION

SELECT  
    DATE_FORMAT(purchase_date,’%Y-%m) as month, 
    user_id 
FROM purchases_c
)
GROUP BY 1

这是唯一的方法吗?此查询需要永远。谢谢!

【问题讨论】:

UNIONs 替换为UNION ALLs 以​​获得更高的性能。除此之外,你的方法已经很好了。 请在reading this 之后edit 提出您的问题。我们需要有关您的表及其索引的更多信息来帮助您。覆盖索引可能会有所帮助。 请提供样本数据、期望的结果和清晰的解释。 听起来构建 abc 而不是一个表是错误的。 请在您的查询前添加 EXPLAIN EXTENDED 并分享。您应该考虑在要从中选择和聚合的列上添加索引。 【参考方案1】:

一种方法是在子查询中使用union all,然后聚合:

select DATE_FORMAT(purchase_date, '%Y-%m') as month,
       count(distinct user_id)
from ((select user_id, purchase_date from purchases_a) union all
      (select user_id, purchase_date from purchases_b) union all
      (select user_id, purchase_date from purchases_c)
     ) p
group by month
 

 

【讨论】:

以上是关于替换 MySQL 中的联合的主要内容,如果未能解决你的问题,请参考以下文章

使用 MySQL 查询查找和替换整个表中的文本

使用 MySQL 查询查找和替换整个表中的文本

使用 MySQL 查询查找和替换整个表中的文本

MySQL搜索并替换字段中的一些文本

替换 MySQL 中的所有字段

MySQL按列名替换表中的值