替换 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
这是唯一的方法吗?此查询需要永远。谢谢!
【问题讨论】:
将UNION
s 替换为UNION ALL
s 以获得更高的性能。除此之外,你的方法已经很好了。
请在reading this 之后edit 提出您的问题。我们需要有关您的表及其索引的更多信息来帮助您。覆盖索引可能会有所帮助。
请提供样本数据、期望的结果和清晰的解释。
听起来构建 a
、b
、c
而不是一个表是错误的。
请在您的查询前添加 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 中的联合的主要内容,如果未能解决你的问题,请参考以下文章