鍍金池/ 問答/Java/ mysql中,B表連接A表,能不能只連接A表中start_date小的那一個(gè),忽

mysql中,B表連接A表,能不能只連接A表中start_date小的那一個(gè),忽略其他的?

1.B表的id對應(yīng)多條A表的contract_id
2.b表連接a表的時(shí)候,如何做到當(dāng)a表的id=b表的contract_id的時(shí)候,只連接A表中start_date小的那一條記錄?
圖片描述

圖片描述

回答
編輯回答
卟乖

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

連接條件可以進(jìn)行過濾

join是笛卡爾積操作,on是對笛卡爾積進(jìn)行篩選,A左連杰B,那么將保留所有的A,將合適的B連接到后面,反之亦然,具體怎么連就考慮具體的情況了

2018年7月29日 08:57
編輯回答
澐染

A,B分別為A表,B表

SELECT A.start_date,B.* FROM A,B WHERE A.contract_id = B.id
2018年7月7日 19:54
編輯回答
臭榴蓮

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

contract_id在A表不在B表,你自己標(biāo)注的要看清楚哦.

2017年6月15日 07:55
編輯回答
朕略傻

試試這個(gè)

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

2018年2月11日 00:02
編輯回答
薄荷綠

謝邀,該問題,我以前也遇到過類似的場景;
實(shí)際上我沒有找到合適的SQL來處理這樣的需求,就算有,現(xiàn)在沒有性能問題以后也會有性能問題,因此我不建議在SQL中完成這樣的邏輯;推薦的方式:

方案1: 調(diào)整數(shù)據(jù)表結(jié)構(gòu)

  1. 給A表一個(gè)status字段,用于區(qū)分同一contract_idstart_date最小的記錄;
  2. 給B表一個(gè)a_id字段用于冗余管理連你所需要記錄的id。

方案2: 在業(yè)務(wù)邏輯上查詢

  1. 如果你一次性查詢的記錄并不多(<100), 我認(rèn)為執(zhí)行101次查詢的耗時(shí)也會優(yōu)于SQL并且給到數(shù)據(jù)庫的壓力也沒那么大。
2017年10月11日 23:02
編輯回答
瞄小懶
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)
2017年12月17日 04:22