MySQL 在同一列上两次连接同一个表,不同的值仅返回最近的行

2024-04-26

我一直试图解决复杂 JOIN 的一小部分。

我们有一个“说明”表和一个“估计”表。在“估计”中,我们有不同类型的多行estimates对于给定的指令。

说明表

id | address | status
1 | 27 TAYLOR ROAD, ALBION PARK NSW 2527 | InProgress

预估表

id | instruction_id | basis | basis_date | basis_value
1 | 1 | ContractPrice | 2012-04-05 | 124000
2 | 1 | CAMV | 2012-02-01 | 120000
3 | 1 | CustomerEstimate | 2012-06-07 | 132000
4 | 1 | ContractPrice | 2013-01-03 | 140000
5 | 1 | CustomerEstimate | 2013-02-09 | 145000

我们想要的实际上是基于 instructions.id =estimates.instruction_id 和estimates.basis 对“estimates”进行 2 个“instructions”连接,用于 1) 最新的“CustomerEstimate”(将 basic_date 和 basic_value 别名为estimate_date 和estimate_value)和 2)最近的“ContractPrice”(再次将 basic_date 和 basic_value 别名为 contact_date 和contract_value)。

预期结果如下:

id | address | status | contract_price | contract_date | estimate_date | estimate_value
1 | 27 TAYLOR ROAD, ALBION PARK NSW 2527 | InProgress | 2013-01-03 | 140000 | 2013-02-09 | 145000

我非常感谢 SQL 专家的帮助。

非常感谢, 特伦特.


Try

SELECT i.id,  
       i.address, 
       i.status,
       p.max_date contract_date, 
       p.basis_value contract_price, 
       e.max_date estimate_date, 
       e.basis_value estimate_value
  FROM Instructions i LEFT JOIN
(
    SELECT q1.instruction_id, max_date, basis_value
      FROM Estimates e JOIN
    (
        SELECT instruction_id, MAX(basis_date) max_date
          FROM Estimates
         WHERE basis = 'CustomerEstimate'
         GROUP BY instruction_id
    ) q1 ON e.instruction_id = q1.instruction_id AND e.basis_date = q1.max_date
) e ON i.id = e.instruction_id LEFT JOIN
(
    SELECT q2.instruction_id, max_date, basis_value
      FROM Estimates e JOIN
    (
        SELECT instruction_id, MAX(basis_date) max_date
          FROM Estimates
         WHERE basis = 'ContractPrice'
         GROUP BY instruction_id
    ) q2 ON e.instruction_id = q2.instruction_id AND e.basis_date = q2.max_date
) p ON i.id = p.instruction_id

Output:



| ID |                              ADDRESS |     STATUS | CONTRACT_PRICE | CONTRACT_DATE | ESTIMATE_VALUE | ESTIMATE_DATE |
----------------------------------------------------------------------------------------------------------------------------
|  1 | 27 TAYLOR ROAD, ALBION PARK NSW 2527 | InProgress |         140000 |    2013-01-03 |         145000 |    2013-02-09 |
  

Here is SQL小提琴 http://sqlfiddle.com/#!2/19b76/9 demo.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL 在同一列上两次连接同一个表,不同的值仅返回最近的行 的相关文章

  • 调用不同 SELECT 语句的 MySQL IF/CASE 语法

    我在使用 MySQL 时遇到问题IF or CASE syntax 程序是这样的 我有一个调用 MySQL 查询的 PHP 项目 假设 PHP 传递变量X If X is not 0那么它应该执行如下查询 SELECT FROM table
  • MySQL REPLACE:如何替换由相同头和尾分隔的每个不同子字符串中出现的所有字符

    我有这个字符串 p span b C10373 FIAT GROUP AUTOMOBILES RAMO DI AZIENDA DI KUEHNE NAGEL b span p p la somma pari a 400 IVA per l
  • PHP 扩展 mysqli 和 nd_mysqli 之间的区别[重复]

    这个问题在这里已经有答案了 Mysqli 准备好的语句 如下所示 在以下情况下会抛出以下错误 get result 叫做 stmt connection gt prepare select column from table where i
  • 如何设置 MySQL Workbench 自动断开与服务器的连接?

    有没有办法设置Workbench在空闲时自动与服务器断开连接 命令行 mysql 客户端在空闲时断开连接 然后在运行查询时重新连接 我也希望 Workbench 自动断开连接 我无法修改服务器的超时设置 但命令行客户端可以按照当前服务器设置
  • 查找返回的 mysql 结果中的行数(nodejs)

    当使用 felixge 的 mysql for node js 时 如何向结果对象询问返回的行数 我有一个相当昂贵的查询 所以我不想运行COUNT 首先 只是为了第二次运行查询 如果是选择查询 则只需获取返回数组的长度即可 connecti
  • 解析日期字符串

    我在 post 变量中有这个字符串 03 21 2011 我需要通过php解析它并将其转换成这种格式 2011 03 21 我正在使用 php 我需要这种格式 以便我可以运行此查询 SELECT prospect as Prospect c
  • 连接后带有 Less/Greater 的Where 子句

    我正在尝试结合一个joins with a where条款 但where子句不是测试相等 而是测试大于或等于 我知道在标准 where 子句中 我可以这样做 Group where vote deadline at lt Time now
  • Mysql 按特定字符串排序

    我似乎找不到这个问题的答案 假设我有一个像这样的表 ID Name 1 AAAAAAAAA 2 ABAAAAAAA 3 BBAAAAAAA 4 CDAAAAAAA 5 BBAAAAAAA 有什么办法可以通过以下方式订购name 但是 从说开
  • 在重复键上仅更新 Null 或空值

    我有一个 mysql 查询来合并主键 IMO 上的两个表 查询工作正常 但我遇到的问题是在重复键更新时 我只想更新 wp second 表的那些没有值的字段 简而言之 在重复键上 wp second 值仅应在 null 或空时更新 这是我到
  • 更改 Amazon RDS MYSQL Linux 服务器的 innodb_log_file_size 变量值

    我们正在使用 Amazon RDS linux 服务器作为 MYSQL 更改 my cnf 文件变量值的方法是什么 我正在尝试更改 innodb log file size 变量 您能告诉我哪一个是最好的改变方式吗 所以请帮我解决这个问题
  • Python Pandas to_sql,如何创建带有主键的表?

    我想使用 Pandas 的 to sql 函数创建一个 MySQL 表 该函数有一个主键 在 mysql 表中拥有主键通常是件好事 如下所示 group export to sql con db name config table grou
  • 选择特定值之后的项目

    说这是我的sql SELECT title author ISBN FROM bs books ORDER BY ISBN LIMIT 3 它只是从某个表中选择所有内容 标题 作者等 假设我想选择某个标题后面的所有项目 而不是按字母顺序或其
  • Spring Boot MultipartFile上传getOriginalFileName根据浏览器不同而不同

    我使用的是 spring boot 1 5 7 RELEASE 版本 我使用以下方法上传文件 Autowired private MyService mySerice RequestMapping value uploadFile meth
  • 如何对变量使用 GRANT?

    我在 MySql 中使用 GRANT 和变量时遇到一些麻烦 SET username user123 pass pass123 GRANT USAGE ON TO username IDENTIFIED BY pass GRANT INSE
  • 未捕获的类型错误:$.ajax 不是函数

    我正在制作一个带有排行榜表的小型游戏项目 我正在尝试使用 jQuery ajax 和 PHP 从 mysql 数据库获取排行榜以显示 但它给了我一条错误消息 我的语法看起来不错 所以我不确定问题是什么 leader btn click fu
  • Mysql 选择 csv 字符串中的 where 字段

    我想从一个表中进行选择 其中的字段位于传递给存储过程的给定 csv 字符串中 最快的方法是什么 我应该将这些值插入临时表并加入其中吗 或者有没有办法用一个语句来做到这一点 Thanks 做了一些搜索并找到了一个很好的答案 使用MySql的字
  • 从同一mysql服务器的不同数据库复制表

    我有一台带有 2 个数据库的服务器 我想将多个表从一个数据库复制到另一个数据库 目的是我们使用项目中使用的相同用户表 正如在另一个表中使用 InnoDB 和用户表的外键一样 我选择了一种复制方式 为此我对 my cnf 进行了更改 mast
  • 从 MySql 返回最后插入的 id

    我在执行以下查询时遇到了一些问题 START TRANSACTION SET LASTID 0 INSERT INTO Accounts Col1 col2 col3 col4 VALUES param1 param2 param3 par
  • 如何像mysql一样对数组进行排序

    如何对与数据库数据相同的数组进行排序 我请求谷歌分析数据 数据是一个大数组 我想将数组与本地数据库中的一些其他字段连接起来 然后我再次扩展大数组 现在我想对大数组进行排序 这与使用我的 sql 相同 如下所示 select from ga
  • Django migrate:不创建表

    经过一些错误后 我删除了数据库 删除了所有迁移文件 我留下了init py 现在 当我跑步时 python migrate py makemigrations It creates migrations correctly python m

随机推荐