gpt4 book ai didi

mysql - 从一个表中选择行,以一对多关系连接另一个表中的最新行

转载 作者:行者123 更新时间:2023-11-29 04:53:24 25 4
gpt4 key购买 nike

我想做的是从一个表(表 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,或类似的简单操作。

最佳答案

我认为这对你有帮助:

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

关于mysql - 从一个表中选择行,以一对多关系连接另一个表中的最新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9110664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com