奇怪的 MySQL JOIN,我想包含匹配项并且没有来自连接的匹配项

Posted

技术标签:

【中文标题】奇怪的 MySQL JOIN,我想包含匹配项并且没有来自连接的匹配项【英文标题】:Weird MySQL JOIN where I want to include matches AND no matches from join 【发布时间】:2021-12-08 09:57:03 【问题描述】:

我需要获取查询的特定结果...我相信解决方案是同一个表的自联接...但它没有像我预期的那样工作。

一点背景知识:“时间范围”列表示时间增量数据集。 “15m”是 15 分钟数据点的数据集。 “1h”是 1 小时数据点的数据集。

这是表格的内容:

priceID | price_time          | timeframe | price | thing
1       | 2020-01-01 10:00:00 | "15m"     | 150   | 0
2       | 2020-01-01 10:15:00 | "15m"     | 155   | 1
3       | 2020-01-01 10:30:00 | "15m"     | 140   | 0
4       | 2020-01-01 10:45:00 | "15m"     | 123   | 1
5       | 2020-01-01 11:00:00 | "15m"     | 159   | 0
6       | 2020-01-01 10:00:00 | "1h"      | 150   | 1
7       | 2020-01-01 11:00:00 | "1h"      | 159   | 0

这就是我需要的记录集。我希望每个唯一 price_time 一行,所有其他列的唯一列,按时间范围值分组。

price_time          | timeframe_15m | timeframe_1h | price_15m | price_1h | thing_15m | thing_1h
2020-01-01 10:00:00 | "15m"         | "1h"         | 150       | 150      | 0         | 1
2020-01-01 10:15:00 | "15m"         | NULL         | 155       | NULL     | 1         | NULL
2020-01-01 10:30:00 | "15m"         | NULL         | 140       | NULL     | 0         | NULL
2020-01-01 10:45:00 | "15m"         | NULL         | 123       | NULL     | 1         | NULL
2020-01-01 11:00:00 | "15m"         | "1h"         | 159       | 150      | 0         | 0

这是我认为可行的方法,但没有。

SELECT  
 c.price_time
 ,c.timeframe AS price_time_15m
 ,c.price AS price_15m
 ,c.thing AS thing_15m
 ,o.timeframe AS timeframe_1h
 ,o.price AS price_1h
 ,o.thing AS thing_1h
 
FROM    tbl_prices c LEFT OUTER JOIN tbl_prices o ON c.price_time = o.price_time
WHERE   c.timeframe = '15m'
 AND    o.timeframe = '1h'

我在这方面花了很长时间,但我被正式卡住了!任何帮助将不胜感激!

【问题讨论】:

o.timeframe = '1h' 应该与 ON 子句而不是 WHERE 子句一起使用,以便 LEFT JOIN 按预期工作。 【参考方案1】:

使用条件聚合:

SELECT price_time,
       MAX(CASE WHEN timeframe = '"15m"' THEN timeframe END) timeframe_15m,
       MAX(CASE WHEN timeframe = '"1h"' THEN timeframe END) timeframe_1h,
       MAX(CASE WHEN timeframe = '"15m"' THEN price END) price_15m,
       MAX(CASE WHEN timeframe = '"1h"' THEN price END) price_1h,
       MAX(CASE WHEN timeframe = '"15m"' THEN thing END) thing_15m,
       MAX(CASE WHEN timeframe = '"1h"' THEN thing END) thing_1h       
FROM tbl_prices
GROUP BY price_time;

请参阅demo。

【讨论】:

以上是关于奇怪的 MySQL JOIN,我想包含匹配项并且没有来自连接的匹配项的主要内容,如果未能解决你的问题,请参考以下文章

MySQL join 与关系表上的匹配

mysql self join with group_concat 并且没有重复

将预算数字加入第一次匹配(加入)

SQL LEFT JOIN 与部分字符串匹配

SQL JOIN 查询返回我们在连接表中没有找到匹配项的行

关于mysql中的left join和left outer join的区别