1. 程式人生 > >一個關於數據庫的聯合查詢

一個關於數據庫的聯合查詢

span 之前 結果 log 名稱 解決方案 class 都是 條件

問題最終要求的結果是這樣的

技術分享

是不是很簡單? 然而,數據庫是這樣式的 技術分享

技術分享

忽略續借操作,只關註借書、還書操作。

技術分享

就是說同一張表,同一本書,既可以存借書,也可以存歸還,而且同一本書還可能借出或者歸還多次。 其他屬性好說,比較麻煩的就是這個歸還時間,同一本書,緊跟著借書操作的還書操作,才是它的歸還時間。 解決方案是這樣的: 把借出操作記為A表,歸還操作記為B表:其中A表22行,B表19行 技術分享 連接條件應當為藏書的編號和讀者的id ,連接的結果為58行。由於數據中,同一本書名有好幾個編號,我把書名給去掉了,連接的結果是這樣的 技術分享 可以看出如果上的記錄框圖框出來的就是問題的所在!框圖框出來的都是同一條借書記錄,它跟每一條的還書記錄連接。從記錄裏可以看出,我讓這個人借了六次同一本書,做了六次的連接! 以下規則可以幫助我們查詢出正確的結果 1)同一組借還操作,借操作一定在還操作之前 2)排除掉借操作時間>還操作的時間的記錄之後,最早的還書時間,就是這個人,這本書的還書時間 最終結果是這樣的 最終SQL代碼是這樣的
select
A.*,min(B.操作時間) 還書時間 from a left join b on a.書籍的典藏編號 = b.書籍的典藏編號 and a.讀者id = b.讀者id and a.操作時間<b.操作時間 group by a.書籍的典藏編號,a.操作名稱,a.操作時間,a.讀者id

技術分享

用的是左外連接,未歸還的還書時間當然就是NULL啦。這樣,其他的子查詢、聯合、分頁都不是問題了。 以上! 技術分享

一個關於數據庫的聯合查詢