【发布时间】:2012-02-02 10:24:09
【问题描述】:
我想做的是从一个表(表 A)中选择一组特定的行并与另一个表(表 B)连接,这样表 A 中只会出现一条记录,并与最近的记录连接来自表 B,基于日期时间列。
例如,表 A 具有以下结构(高度简化):
id | col_1 | col_2
---+-----------+----------------
1 | something | something else
2 | val_1 | val_2
3 | stuff | ting
4 | goats | sheep
表 B 是这样的:
id | fk_A | datetime_col | col_3
---+-----------+---------------------+--------
1 | 1 | 2012-02-01 15:42:14 | Note 1
2 | 1 | 2012-02-02 09:46:54 | Note 2
3 | 1 | 2011-11-14 11:18:32 | Note 3
4 | 2 | 2009-04-30 16:49:01 | Note 4
5 | 4 | 2013-06-21 15:42:14 | Note 5
6 | 4 | 2011-02-01 18:44:24 | Note 6
我想要一个如下所示的结果集:
id | col_1 | col_2 | datetime_col | col_3
---+-----------+----------------+---------------------+--------
1 | something | something else | 2012-02-02 09:46:54 | Note 2
2 | val_1 | val_2 | 2009-04-30 16:49:01 | Note 4
3 | stuff | ting | NULL | NULL
4 | goats | sheep | 2013-06-21 15:42:14 | Note 5
因此您可以看到表 B 已在 B.fk_A = A.id 上与表 A 连接,但结果中仅包含来自 B 的最新对应记录。
我尝试了SELECT DISTINCT、LEFT JOIN 和子查询的各种组合,但我无法让它工作,要么没有结果,要么是这样:
id | col_1 | col_2 | datetime_col | col_3
---+-----------+----------------+---------------------+--------
1 | something | something else | 2012-02-01 15:42:14 | Note 1
1 | something | something else | 2012-02-02 09:46:54 | Note 2
1 | something | something else | 2011-11-14 11:18:32 | Note 3
2 | val_1 | val_2 | 2009-04-30 16:49:01 | Note 4
3 | stuff | ting | NULL | NULL
4 | goats | sheep | 2013-06-21 15:42:14 | Note 5
4 | goats | sheep | 2011-02-01 18:44:24 | Note 6
...重复表 A 中的记录。
显然,我的 SQL-fu 不足以胜任这项任务,所以如果你们中的哪位好心人能指出我正确的方向,我将不胜感激。我已经做了很多谷歌搜索和搜索,但我没有找到任何与这个特定任务相匹配的东西,尽管我确信这个问题之前已经被问过 - 我怀疑有一个我忘记/不知道的 SQL 关键字并且如果我搜索它,我会立即找到答案。
我认为this question 处理同样的问题,尽管我不是 100% 确定并且接受的答案涉及SELECT TOP,我认为 (?) 在 MySQL 中无效。
由于我的实际查询要复杂得多并且要连接多个表,我将展示它以防它对如何完成有任何影响:
SELECT `l` . * , `u`.`name` AS 'owner_name', `s`.`name` AS 'acquired_by_name', `d`.`type` AS `dtype` , `p`.`type` AS `ptype`
FROM `leads` l
LEFT JOIN `web_users` u ON `u`.`id` = `l`.`owner`
LEFT JOIN `web_users` s ON `s`.`id` = `l`.`acquired_by`
LEFT JOIN `deal_types` d ON `d`.`id` = `l`.`deal_type`
LEFT JOIN `property_types` p ON `p`.`id` = `l`.`property_type`
此查询有效并返回我想要的数据(有时我还添加了一个WHERE 子句,但这很好用),但我现在想:
LEFT JOIN `notes` n ON `n`.`lead_id` = `l`.`id`
...其中notes 包含“许多记录”,leads 包含与之相关的“一个记录”。
还应注意,我可能还想返回最旧的记录(在不同的查询中),但我想这将是一个在某处反转 ASC/DESC 或类似简单的简单情况。
【问题讨论】:
标签: mysql join one-to-many