mysql中,B表连接A表,能不能只连接A表中start_date小的那一个,忽略其他的?

1.B表的id对应多条A表的contract_id
2.b表连接a表的时候,如何做到当a表的id=b表的contract_id的时候,只连接A表中start_date小的那一条记录?
图片描述

图片描述

阅读 2.8k
6 个回答
SELECT * 
FROM B
JOIN A ON B.id=A.contract_id AND NOT EXISTS 
        (SELECT 1 FROM A a2 WHERE a2.contract_id=A.contract_id AND a2.start_date<A.start_date)

试试这个

SELECT MIN(A.start_date) as start_date 
  FROM A JOIN B 
    ON A.contract_id = B.id 
  GROUP BY A.contract_id;

A a left join B b on a.contract_id = b.id and a.start < b.start

连接条件可以进行过滤

join是笛卡尔积操作,on是对笛卡尔积进行筛选,A左连杰B,那么将保留所有的A,将合适的B连接到后面,反之亦然,具体怎么连就考虑具体的情况了

A,B分别为A表,B表

SELECT A.start_date,B.* FROM A,B WHERE A.contract_id = B.id

select min(A.start_date) as sDate from A join B on A.contract_id = B.id;

contract_id在A表不在B表,你自己标注的要看清楚哦.

谢邀,该问题,我以前也遇到过类似的场景;
实际上我没有找到合适的SQL来处理这样的需求,就算有,现在没有性能问题以后也会有性能问题,因此我不建议在SQL中完成这样的逻辑;推荐的方式:

方案1: 调整数据表结构

  1. 给A表一个status字段,用于区分同一contract_idstart_date最小的记录;
  2. 给B表一个a_id字段用于冗余管理连你所需要记录的id。

方案2: 在业务逻辑上查询

  1. 如果你一次性查询的记录并不多(<100), 我认为执行101次查询的耗时也会优于SQL并且给到数据库的压力也没那么大。
推荐问题
宣传栏