MySQL:在一个查询中使用左连接和联合

时间:2014-02-08 15:40:37

标签: mysql sql phpmyadmin

我有两个名为tblborrow和tblreturn的表,其中都有日期列。

现在,我要做的是显示几乎所有来自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

但它说“Subquery返回的行数超过1行”,经过大量彻底的谷歌搜索后,我似乎无法做到这一点。

帮助,有人吗?提前谢谢!

3 个答案:

答案 0 :(得分:2)

如果要为借用/返回组合分隔行,则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;

答案 1 :(得分: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 

答案 2 :(得分:0)

尝试以下方法。因为您要将2个不同的日期值合并到同一列中,所以您需要区分哪些行反映了返回与借用操作。

我假设您希望借用/返回日期详细信息在每一行。如果你不关心那,那么戈登的最后回应就没问题了。

下面的第一个栏目将显示借阅但未归还的书籍的空白。

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