一個(gè)關(guān)于數(shù)據(jù)庫(kù)的聯(lián)合查詢的實(shí)例

問題最終要求的結(jié)果是這樣的

一個(gè)關(guān)于數(shù)據(jù)庫(kù)的聯(lián)合查詢的實(shí)例

?是不是很簡(jiǎn)單?

然而,數(shù)據(jù)庫(kù)是這樣式的

一個(gè)關(guān)于數(shù)據(jù)庫(kù)的聯(lián)合查詢的實(shí)例

一個(gè)關(guān)于數(shù)據(jù)庫(kù)的聯(lián)合查詢的實(shí)例

忽略續(xù)借操作,只關(guān)注借書、還書操作。

一個(gè)關(guān)于數(shù)據(jù)庫(kù)的聯(lián)合查詢的實(shí)例

就是說同一張表,同一本書,既可以存借書,也可以存歸還,而且同一本書還可能借出或者歸還多次。

其他屬性好說,比較麻煩的就是這個(gè)歸還時(shí)間,同一本書,緊跟著借書操作的還書操作,才是它的歸還時(shí)間。

解決方案是這樣的:

把借出操作記為A表,歸還操作記為B表:其中A表22行,B表19行

一個(gè)關(guān)于數(shù)據(jù)庫(kù)的聯(lián)合查詢的實(shí)例

?連接條件應(yīng)當(dāng)為藏書的編號(hào)和讀者的id ,連接的結(jié)果為58行。由于數(shù)據(jù)中,同一本書名有好幾個(gè)編號(hào),我把書名給去掉了,連接的結(jié)果是這樣的

一個(gè)關(guān)于數(shù)據(jù)庫(kù)的聯(lián)合查詢的實(shí)例

可以看出如果上的記錄框圖框出來的就是問題的所在!框圖框出來的都是同一條借書記錄,它跟每一條的還書記錄連接。從記錄里可以看出,我讓這個(gè)人借了六次同一本書,做了六次的連接!

?以下規(guī)則可以幫助我們查詢出正確的結(jié)果

1)同一組借還操作,借操作一定在還操作之前

2)排除掉借操作時(shí)間>還操作的時(shí)間的記錄之后,最早的還書時(shí)間,就是這個(gè)人,這本書的還書時(shí)間

最終結(jié)果是這樣的

?最終SQL代碼是這樣的

select?A.*,min(B.操作時(shí)間)?還書時(shí)間?from?aleft?join?  ?bon?a.書籍的典藏編號(hào)?=?b.書籍的典藏編號(hào)?and?a.讀者id?=?b.讀者id?  and?a.操作時(shí)間<b.><p><img src="https://img.php.cn/upload/article/000/023/547/426f61aa9c856c5da0dc83174e9abb14-5.png" alt=""></p> <p>用的是左外連接,未歸還的還書時(shí)間當(dāng)然就是NULL啦。這樣,其他的子查詢、聯(lián)合、分頁(yè)都不是問題了。</p> <p><img alt=""></p></b.>

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊15 分享