2014-02-08 50 views
0

我有兩個名爲tblborrow和tblreturn的表,它們都有日期列。MySQL:在一個查詢中使用左連接和並集

現在,我想要做的是從tblborrow和tblreturn中顯示幾乎所有的列,按照date_borrowed和date_returned的順序排列。

我tblborrow包含以下幾列:

  • borrow_id
  • ISBN
  • member_id
  • staff_id
  • date_borrowed

雖然tblreturn包含:

  • return_id
  • borrow_id
  • staff_id
  • date_returned

我已經做了展示他們與左連接使用此:

SELECT a.isbn, a.member_id, a.staff_id, a.date_borrowed, b.staff_id, b.date_returned 
FROM tblborrow AS a left join tblreturn AS b on a.borrow_id = b.borrow_id 
ORDER BY date_borrowed, date_returned 

它給了我什麼,我需要除當然,date_returned和date_borrowed顯示在單獨的列中。

現在,我試圖通過測試使用UNION他們如果也給我我需要什麼,所以我用:

SELECT date_borrowed FROM tblborrow 
UNION ALL 
SELECT date_returned FROM returning 

而且它也的確。但我需要這些僅在一個查詢中。我想簡單地將查詢像這樣:

SELECT a.isbn, a.member_id, a.staff_id, b.staff_id, 
(SELECT date_borrowed FROM tblborrow 
UNION ALL 
SELECT date_returned FROM returning) 
FROM tblborrow AS a left join tblreturn AS b on a.borrow_id = b.borrow_id 
ORDER BY date_borrowed, date_returned 

但它說:「子查詢返回多個1行」和我似乎仍不能徹底地段谷歌-ING之後做到這一點。

幫助,任何人?提前致謝!

+1

您能否編輯您的問題以指定您的結果集中需要哪些列和行?你想要每行一行,還是每行一行?似乎有些物品已被借用但未歸還。這種情況下你想要什麼?其他項目已被借用,然後返回。這種情況下你想要什麼?當date_returned可用時,是否要使用date_returned值代替date_borrowed值(用​​於顯示和排序)? –

+0

最初可以在其餘列上有空值,但Gordon Linoff的查詢已經提供了我所要求的(實際上更多)。不管怎麼說,還是要謝謝你。 :D – Suika

回答

1

如果要分隔借用/返回組合的行,則union all是合適的。如果是這樣,我想這你想要做什麼:

SELECT b.isbn, b.member_id, b.staff_id, date_borrowed, 'borrow' as which 
FROM tblborrow b 
UNION ALL 
SELECT b.isbn, b.member_id, r.staff_id, date_returned, 'return' as which 
FROM tblreturn r join 
    tblborrow b 
    on r.borrw_id = b.borrow_id; 
+0

這個伎倆!我沒有提到我如何知道這是否是「回報」或「借用」的部分,因爲我正在計劃一個完全不同的(和麻煩的)事情,但是你已經解決了我的兩個問題。 :) 將研究更多關於您使用的策略。非常感謝! :D – Suika

0

加入你的工會加入試試這個設置

SELECT 
    a.isbn, 
    a.member_id, 
    a.staff_id, 
    b.staff_id, 
    u.combined_date 
FROM 
    tblborrow AS a 
    LEFT JOIN tblreturn AS b 
    ON a.borrow_id = b.borrow_id 
    LEFT JOIN 
    (SELECT 
     borrow_id, 
     date_borrowed AS combined_date 
    FROM 
     tblborrow 
    UNION 
    ALL 
    SELECT 
     borrow_id, 
     date_returned AS combined_date 
    FROM 
     returning) u 
    ON (u.borrow_id = a.borrow_id) 
ORDER BY u.combined_date 
+0

這也做了我的要求,除了我會發佈一個後續問題,關於如何區分借用交易與回報交易。不過現在已經修復了。謝謝! :d – Suika

0

嘗試以下。因爲您正在將兩個不同的日期值合併到同一列中,所以您需要區分哪些行反映了回報與借用操作。

我假設你想借用/返回日期詳細信息在每一行。如果你不關心這個問題,那麼Gordon的最後迴應就可以。

下面的第一個塊將顯示借用圖書的空白,但未返回。

另外,UNION ALL將保留重複行而不捨棄它們。如果UNION ALL被使用而不是UNION,那麼下面的查詢應該沒有什麼不同,因爲它不會返回任何重複。

select   'BORROW'    as action 
       , b.date_borrowed as action_date 
       , b.isbn 
       , b.member_id 
       , b.staff_id   as borrow_from_staff 
       , b.date_borrowed 
       , r.date_returned 
       , r.staff_id   as return_to_staff 
from    tblborrow b 
     left join tblreturn r 
      on b.borrow_id = r.borrow_id 
union 
select   'RETURN'    as action 
       , r.date_returned as action_date 
       , b.isbn 
       , b.member_id 
       , b.staff_id   as borrow_from_staff 
       , b.date_borrowed 
       , r.date_returned 
       , r.staff_id   as return_to_staff 
from   tblreturn r 
      join tblborrow b 
      on r.borrow_id = b.borrow_id 
order by  action_date 
       , isbn