Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在一些“左联接”之后选择包含最新日期时间字段的完整行_Mysql_Sql_Datetime_Left Join_Greatest N Per Group - Fatal编程技术网

Mysql 在一些“左联接”之后选择包含最新日期时间字段的完整行

Mysql 在一些“左联接”之后选择包含最新日期时间字段的完整行,mysql,sql,datetime,left-join,greatest-n-per-group,Mysql,Sql,Datetime,Left Join,Greatest N Per Group,是的,它似乎被回答了很多次,但我尝试的一切都失败了 stackoverflow最相似的帖子肯定是: 但是这里的主要区别是,我需要在之前执行了一些左连接之后进行分组 情况如下: 我有3个表transaction、support和transaction\u support,它们链接了前面的2个表 创建表`事务` id INT, 日期/时间日期, 注释文本, 主键id ; 创建表“支持”` id int, 支持编号int, 主键id ; 创建表'transaction\u support` id IN

是的,它似乎被回答了很多次,但我尝试的一切都失败了

stackoverflow最相似的帖子肯定是: 但是这里的主要区别是,我需要在之前执行了一些左连接之后进行分组

情况如下:

我有3个表transaction、support和transaction\u support,它们链接了前面的2个表

创建表`事务` id INT, 日期/时间日期, 注释文本, 主键id ; 创建表“支持”` id int, 支持编号int, 主键id ; 创建表'transaction\u support` id INT, 事务id int, 支持id int, 主键id, 外键事务\u id引用事务id, 外键支持\u id引用支持id ; 在“支持”值中插入1111; 在“支持”值中插入2222; 在“支持”值中插入3333; 在'transaction'值1'中插入'1996-06-28 00:00:00','Old data,we shouln not see'; 在'transaction'值2中插入'1996-07-16 00:00:00','旧数据,我们不应该看到'; 在'transaction'值3'中插入'2001-04-10 00:00:00','旧数据,我们不应该看到它'; 在'transaction'值4'中插入'2001-05-14 00:00:00','Danny'的最新数据'; 在'transaction'值5'中插入'2001-05-14 00:00:00','John'的最新数据'; 在'transaction'值6'中插入'2001-04-10 00:00:00','旧数据,我们不应该看到它'; 在“交易支持”中插入值487131、1、2; 在“交易支持”中插入值488504、2、2; 将值751126、3、2插入“交易支持”中; 在“交易支持”中插入值758188、4、2; 在“交易支持”中插入值4444、5、3; 在“交易支持”中插入值4445、6、3; 下面是一个请求,请尝试:

选择s.id作为s\u id,t.*,选择MAXt.date\u time作为“此日期很好”` 从支持到支持 左连接事务\u支持作为ts上的ts。支持\u id=s.id 在ts.transaction\u id=t.id上作为t左连接事务 按ts.support\U id分组 再次尝试子查询:

选择s.id作为支持id,t.*sub* 从支持到支持 左连接事务\u支持作为ts上的ts。支持\u id=s.id 在ts.transaction\u id=t.id上作为t左连接事务 左连接 选择ts.support\u id作为“sub\u support\u id”, t、 id为'sub_transaction_id', MAXt.date\u time为“sub\u last\u date”` 从事务处理支持到ts 在ts.transaction\u id=t.id上作为t左连接事务 按ts.support\U id分组 在ts.support\u id=sub.sub\u support\u id和t.date\u time=sub.sub\u last\u日期 按s.id分组 预期结果将是:

|support_id | transaction_id | transaction_notes       | transaction_date|
|-----------|----------------|-------------------------|-----------------|
| 1         | null           | null                    | null            |
| 2         | 4              | Lastest data from Danny | 2001-05-14      |
| 3         | 5              | Lastest data from John  | 2001-05-14      |
我尝试了很多请求,有子查询和没有子查询,但到目前为止,当我按支持ID分组时,我从未从事务表中获得所有最新数据

但我很确定我需要一个子查询

这是一把小提琴:

我尝试过的其他类似帖子:


如果有人能帮我找出解决办法。。。谢谢

对于您的MySql版本,没有简单的解决方案。 您可以使用“不存在”获取每个支持id的最新日期时间数据,并将支持加入到该结果集:

SELECT s.id AS support_id, 
       x.id AS transaction_id,  
       x.notes AS transaction_notes,
       x.date_time AS transaction_date
FROM support AS s
LEFT JOIN (
  SELECT ts.support_id, t.id, t.notes, t.date_time
  FROM transaction_support ts INNER JOIN transaction t
  ON ts.transaction_id = t.id
  WHERE NOT EXISTS (
    SELECT 1
    FROM transaction_support ts2 INNER JOIN transaction t2
    ON ts2.transaction_id = t2.id
    WHERE ts2.support_id = ts.support_id AND t2.date_time > t.date_time
  )
) AS x ON x.support_id = s.id
看。 结果:


如果需要每个支持的最新事务,有一个选项使用子查询在左联接的on子句中进行筛选:


这是一个问得很好的问题,但缺少一条关键信息:请以表格文本的形式向我们展示您想要的结果。请具体说明您使用的MySQL版本。如果您使用的是MySQL 8.0,那么最好的解决方案是使用窗口函数。但如果您使用较旧版本的MySQL,则不支持窗口函数。MySQL版本为5.6。我不知道窗口函数,我会读一些,我很抱歉curious@GMB我很快就会加上去的,谢谢!很有效,谢谢!我不明白SELECT 1的NOT EXISTS子句下面是什么。。。但无论如何,这很好!现在我有一个问题:@GMB也给了我一个很好的答案。我知道的不多,无法决定谁的答案是最好的。你有什么想法吗d在您的情况下,要求获取包含最新日期的行。So NOT EXISTS将返回联接表transaction_support和transaction的行,其中没有另一行具有相同的support_id和更大的日期。这是不存在的,它不必扫描整个表就可以做到。它一找到它要找的东西就返回。两个答案都试一下。很有效,谢谢!的确,似乎没有简单的解决办法!现在我有另一个问题:@forpas也给了我一个很好的答案。我知道的不多,无法决定谁的答案是最好的。你有什么想法吗我认为a不能接受两个答案?
> support_id | transaction_id | transaction_notes       | transaction_date
> ---------: | -------------: | :---------------------- | :---------------
>          1 |           null | null                    | null            
>          2 |              4 | Lastest data from Danny | 2001-05-14      
>          3 |              5 | Lastest data from John  | 2001-05-14
select s.*, t.*
from support s
left join (
    select t.*, ts.support_id
    from transaction_support ts 
    inner join transaction t 
        on  t.id = ts.transaction_id
        and t.date_time = (
            select max(t1.date_time)
            from transaction_support ts1
            inner join transaction t1 on t1.id = ts1.transaction_id
            where ts1.support_id = ts.support_id
        )
) t on s.id = t.support_id