2012-02-02 50 views
1

我想要做的是从一个表(表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 DISTINCTLEFT 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或类似的简单方法。

回答

4

我认为这将有助于你:

SELECT A.id, A.col_1, A.col_2, A.datetime_col, A.col_3 
FROM 
    (SELECT B.id, B.col_1, B.col_2, C.datetime_col, C.col_3 
    FROM tableA B LEFT OUTER JOIN tableB C ON B.id = C.id 
    ORDER BY C.datetime_col desc) as A 
GROUP BY A.id 
+1

谢谢,这帮助了很多。 – DaveRandom 2012-02-02 16:26:05

+0

这节省了我的时间,非常感谢你!如果我能两次投票给你,我会的。 – haakym 2014-03-20 14:42:17

相关问题