【问题标题】:Select rows from one table, join most recent row from other table with one-to-many relationship从一个表中选择行,以一对多关系连接另一个表中的最新行
【发布时间】: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 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-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


    【解决方案1】:

    我认为这会对你有所帮助:

    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
    

    【讨论】:

    • 这节省了我几个小时,非常感谢!如果我能给你两次投票,我会的。
    猜你喜欢
    • 2012-06-28
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 2015-05-03
    • 2015-03-22
    • 2010-10-04
    • 1970-01-01
    • 2015-01-02
    相关资源
    最近更新 更多