我想要做的是从一个表(表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已加入的表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福是只是不适合这个任务不够好,所以我将不胜感激,如果你一种人能在正确的方向指向我。我已经做了相当多的谷歌搜索和SO摸索的,我还没有发现这个特定的任务匹配任何东西,但我相信这个问题已经被问过 - 我怀疑的是,我忘了一个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或类似的简单方法。
谢谢,这帮助了很多。 – DaveRandom 2012-02-02 16:26:05
这节省了我的时间,非常感谢你!如果我能两次投票给你,我会的。 – haakym 2014-03-20 14:42:17