【发布时间】:2021-05-08 01:29:39
【问题描述】:
问题摘要:
我需要根据聚合函数将单行连接到表输出,在本例中是最近的对应记录。关于这个主题的各种其他问题似乎都基于两个表值都是必需的(INNER JOIN 等),但在我的情况下,聚合需要在 LEFT JOIN 表上工作,该表很多时候将是 @987654327 @。
MySQL 5.7; 这里有几个说明性表格:
表格
Core_data:
-----------
create table `core`
(
core_id int(8) unsigned auto_increment primary key,
some_name varchar(80) null,
some_data varchar(80) null,
some_values .... etc.
)
Linked_data:
------------
create table `linked_data`
(
link_id smallint(6) unsigned auto_increment primary key,
core_id int(8) unsigned
data_date date,
some_linked_data_values varchar(80) null
)
我有一个处理几十个表的查询。从 Core 表中选择 1 行,并从其他数十个表中选择各种 LEFT JOIN 数据。
图示的链接数据表有数据,日期很重要,只返回最近的。
示例数据:
linked_data
------------
link_id | core_id | data_date | data_value | ...
-------------------------------------------------
1 | 2 | 2020-09-03 | something | ...
2 | 4 | 2019-07-29 | whatever | ...
3 | 1 | 2017-11-09 | yews | ...
4 | 4 | 2018-04-10 | socks | ...
我只想加入 core_id = 4 和最大日期值的行。如何在JOIN 场景中创建它;我无法将MAX 聚合放入JOIN ... ON 条件中。
我当前的 SQL:
我的 SQL 是这样的:
SELECT ... many columns ...,
ld.data_value,
ld.data_date,
more.columns ...
FROM core
LEFT JOIN table1 ON core.core_id = table1.core_id
LEFT JOIN table2 ON core.core_id = table2.core_id
LEFT JOIN table3 ON core.core_id = table3.core_id
... etc ...
LEFT JOIN linked_data ld ON core.core_id = ld.core_id AND MAX(ld.data_date)
WHERE ... core_id = value
一个表我只需要一个具有最高列值的结果行(基于数据),linked_data 没有理由保存任何数据,因此 LEFT JOIN 可能返回 NULL
预期结果:
对于core_id = 4,我希望能够输出包含linked_data.data_value = whatever 的单个SQL 行结果。对于core_id = 5,我希望能够输出其余数据,但linked_data. 表中没有。
我已经尝试了什么?
-
This answer 被标记为正确,但也注意到随着数据量的增加它会很快变得非常慢。
-
This answer 将限定符放在
WHERE子句中,但没有保证linked_data将包含任何结果,所以我当然可以添加更多条件(检查是否进入WHERE子句,但我希望避免这种情况。 -
This MySQL post 有另一种可能的解决方案,但 cmets 对此也表示它非常慢(这可能是他们的用户错误,我还没有测试过)。
-
我也尝试在 LEFT JOIN 中使用 SELECT,如下所示:
SELECT ... many columns ..., ld.data_value, ld.data_date, more.columns ... FROM core LEFT JOIN table1 ON core.core_id = table1.core_id LEFT JOIN table2 ON core.core_id = table2.core_id LEFT JOIN table3 ON core.core_id = table3.core_id ... etc ... LEFT JOIN ( SELECT linked_data FROM linked_data ldi WHERE core.core_id = ldi.core_id AND MAX(ldi.data_date) ) as ld ON core.core_id = ldi.core_id WHERE ... core_id = value
引用自this Q&A
但这仍然告诉我这里不允许聚合调用
编辑:我找到了不允许聚合的原因;我的一个简单的语法错误;但我已经提出了一个完整的答案来澄清这个问答,因为我在搜索时找不到任何相关的答案,所以这可能对某人有用。
如果有人有更正确的解决原始问题的方法,请分享!
【问题讨论】:
标签: mysql