gpt4 book ai didi

mysql - 在 mysql 中组合简单的选择(加入或联合?)

转载 作者:行者123 更新时间:2023-11-29 05:48:35 25 4
gpt4 key购买 nike

我有两个查询都非常快(20 毫秒)- 当我将它们与连接组合时,我得到一个 30 秒的查询,但数据是错误的...有什么问题吗?

SELECT
count(profile.id),
date(profile.createdAt)
FROM profile
GROUP BY date(profile.createdAt)
ORDER BY date(profile.createdAt) DESC;

SELECT
count(product.id),
date(product.createdAt)
FROM product
GROUP BY date(product.createdAt)
ORDER BY date(product.createdAt) desc;

加入他们我得到一个非常慢的查询:

SELECT
count(profile._id),
date(profile.createdAt),
count(product._id),
date(product.createdAt)
FROM profile
INNER JOIN product
ON date(product.createdAt) = date(profile.createdAt)
GROUP BY
date(product.createdAt),
date(profile.createdAt)
ORDER BY date(product.createdAt) desc;

最佳答案

您当前方法的逻辑错误是,由于连接,您重复计算了一个或两个计数。您可以尝试在单独的子查询中进行聚合,然后加入这些子查询:

SELECT
t1.createdAt,
COALESCE(t1.profile_cnt, 0) AS profile_cnt,
COALESCE(t2.product_cnt, 0) AS product_cnt
FROM
(
SELECT DATE(createdAt) AS createdAt, COUNT(id) AS profile_cnt
FROM profile
GROUP BY DATE(createdAt)
) t1
INNER JOIN
(
SELECT DATE(createdAt) AS createdAt, COUNT(id) AS product_cnt
FROM product
GROUP BY DATE(createdAt)
) t2
ON t1.createdAt = t2.createdAt;

如果两个表不包含相同的日期,则上述查询可能会删除某些日期。为避免这种情况,我们可以加入一个日历表,其中包含我们希望在输出中显示的所有日期。

关于性能,您正在执行两个聚合查询的连接,因此预计不会有那么高的性能。此外,调用 DATEcreatedAt 转换为纯日期的成本很高,也许可以通过维护专用日期列来避免。

关于mysql - 在 mysql 中组合简单的选择(加入或联合?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57085977/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com