首页 > 解决方案 > MySQL Query 试图(CROSS?)在一张表上加入

问题描述

一直试图解决这个问题几个小时,并希望得到一些专家的帮助:

我有一个 Mysql 表,其中包含以下数据:

Date       version   amount
2021-03-01 A         100
2021-03-02 A          35
2021-03-02 B          80
2021-03-03 A           7
2021-03-03 B          90
2021-03-03 C           3
2021-03-03 A           8
2021-03-04 B          15
2021-03-04 C          90
2021-03-04 B          10

并尝试每天为每个版本获取输出,将数量填充为 null 的“0”;结果:

Date        version    SUM(amount)
2021-03-01  A          100
2021-03-01  B            0
2021-03-01  c            0
2021-03-02  A           35
2021-03-02  B           80
2021-03-02  C            0
2021-03-03  A           15
2021-03-03  B           90
2021-03-03  C            3
2021-03-04  A            0
2021-03-04  B           25
2021-03-04  C           90

我尝试了各种“JOIN”、“LEFT JOIN”和“CROSS JOIN”排列,但均未成功。

SELECT distinct c1.date, c2.version
FROM crash_log c1
LEFT OUTER JOIN crash_log c2 ON c1.date = c2.date
GROUP BY c1.date, c2.version

(甚至没有弄乱 SUM,只是想用这个来获取所有行)

现在,我有一个通过蛮力执行此操作的脚本:获取 DISTINCT 日期,然后获取 DISTINCT 版本,然后执行嵌套循环并为每个组合构建一个数组。一个问题是它不可扩展,并且似乎 Web 连接在流程完成之前就超时了。

我在想有一个(半?)有效的查询可以做到这一点,但我无法弄清楚。

标签: mysql

解决方案


编写子查询以获取所有日期和版本。交叉加入这些以获得每个组合。

然后将其与表连接起来以获得实际值或在 NULL 时默认为 0。

SELECT d.date, v.version, IFNULL(c.sum, 0) AS sum
FROM (
    SELECT DISTINCT date
    FROM crash_log) AS d
CROSS JOIN (
    SELECT DISTINCT version
    FROM crash_log) AS v
LEFT JOIN (
    SELECT date, version, SUM(amount) AS sum
    FROM crash_log
    GROUP BY date, version) AS c ON d.date = c.date AND v.version = c.version
ORDER BY d.date, v.version

推荐阅读