在多个表上进行SELECT查询

时间:2014-04-25 12:34:20

标签: mysql sql database

我有两张桌子,

ID  NAME
-------------------
12  Jon Doe
4   Jane Doe
9   Sam Doe

MemID   Cat#            DateChkOut      DateDue          DateRet
4   T 430.98 1956      15-Mar-2011      14-Jun-2011     31-May-2011
12  B 125.2 2013       15-Mar-2011      14-Jun-2011 
4   T 430.98 1956      27-Dec-2012      25-Mar-2013 

现在我需要列出从未签出书籍的“会员”名字。

SELECT Name FROM MEMBER, CHECKOUT WHERE ID != MemID;

没用。有什么建议吗?

8 个答案:

答案 0 :(得分:1)

SELECT name FROM member WHERE id NOT IN (SELECT MemID FROM checkout)

我认为它应该完成这项工作

答案 1 :(得分:1)

SELECT id,
       name
FROM Member
WHERE id NOT IN
    (SELECT memid
     FROM checkout)

SELECT id,
       name
FROM member m
LEFT OUTER JOIN checkout c ON m.id = c.memid
WHERE c.memid IS NULL

答案 2 :(得分:1)

使用NOT EXISTS的相关子查询。

SELECT Name 
  FROM MEMBER a
 WHERE NOT EXISTS(SELECT 1 FROM CHECKOUT b WHERE b.MemID = a.ID)

请参阅Optimizing Subqueries with EXISTS Strategy

答案 3 :(得分:1)

在这种情况下,您需要使用LEFT JOIN

尝试以下方法:

SELECT M.Name
FROM MembersTable M
LEFT JOIN CheckoutTable C On C.MemId = M.ID
WHERE C.MemId IS NULL

编辑:

LEFT JOIN适用于这种情况,因为它将公共密钥上的两个表连接起来 - 在本例中为MemId。由于这是LEFT JOIN,它将占用Left表(Members)中存在的所有内容,如果找到匹配项,它将包含Right表(Checkout)上的所有内容。但如果在Checkout表中找不到匹配项,那么该方面的所有内容都将为NULL

因此,您需要做的就是检查右侧是否为NULL

希望这是有道理的:)

答案 4 :(得分:1)

如果您在查询中使用NOT IN,对于大型查询来说可能会很慢,请尝试使用JOIN,这样会更快:

SELECT MEMBER.NAME FROM MEMBER 
LEFT JOIN CHECKOUT ON CHECKOUT.MemID = MEMBER.ID 
WHERE CHECKOUT.MemID IS NULL:

答案 5 :(得分:1)

因为您可能希望返回更多字段,所以外连接是实现此目的的好方法。

SELECT Name 
FROM MEMBER M
LEFT JOIN CHECKOUT C
 on M.ID = C.MemID
WHERE C.MemID is null;

答案 6 :(得分:1)

试试这个:

SELECT M.ID,M.Name 
FROM MEMBER M LEFT JOIN
     CHECKOUT C ON C.MemID=M.ID
WHERE C.DateRet IS NULL

它将选择DateRet为空的用户详细信息。

示例结果:

ID  NAME
-------------------
12  Jon Doe
4   Jane Doe

答案 7 :(得分:1)

您必须使用where in并检查DateChkOut

SELECT Name
FROM   MEMBER
WHERE  ID not in
       ( select MemID
         from   CHECKOUT
         where  DateChkOut is not null
       )