2012-06-15 194 views
0

我有一个客户信息,订单等数据库。我需要运行一个查询,返回所有没有下订单的客户。需要帮助写一个MySQL查询

相关表格:登录和订单

相关列:login.loginID,login.loginFirstName,login.loginLastName,login.loginEmailAddress和orders.OrderuserID

所以基本上 - 在伪代码:比较表登录,列loginID用于orders.OrderUserID下的orders表中的匹配项。如果不存在匹配(如未放置任何订单),则输出用户名字,姓氏和电子邮件地址。

我一直在想我的大脑,但有一些与语言的真正问题。谈到SQL时,我是N00B的大好时机。

+3

让我们来看看你已经尝试什么作为第一四处 – Bryan

+0

我假设我有子集,但我不能从声明中得到过去的选择。 ..不知道从哪里开始。任何帮助将不胜感激。我通过逆向工程学得最好,所以看到正确的答案会帮助我理解你是如何到达那里的。谢谢 –

+0

欢迎来到Stack Overflow。请在发布问题时考虑总是发布http://whathaveyoutried.com。这有助于我们了解您的背景,并显示您不是“请给我代码”的男孩。 – rcdmk

回答

1
select loginFirstName, loginLastName, loginEmailAddress 
from login 
where loginID not in 
    (select distinct OrderuserID from orders) 

你也可以做到这一点与左连接:

select loginFirstName, loginLastName, loginEmailAddress 
from login left join orders on loginID = OrderuserID 
where OrderuserID is null 

不知道这将更快地执行;试一试。第一个更容易理解,恕我直言。

编辑:“选择不同”的意思是“返回我的字段的唯一值的集合”。因此,第一个SQL中的子查询返回了有订单的用户(他们的ID)集合。如果用户有多个订单,则DISTINCT会确保她的ID只返回一次。

+0

加入会更快,有时会有很大的差距。 – raina77ow

+0

根据rusultset和表结构,连接可以更快。 – rcdmk

+0

选择不同的我们的好奇心的功能是什么...第一个更快地运行btw –

0

这应做到:

select * 
from login l 
left join orders o on l.loginId = o.OrderuserID 
where o.OrderuserID is null 
2

基本上它会看起来像:

 SELECT l.login_id 
     FROM login l 
    LEFT JOIN orders o 
      ON l.login_id = o.login_id 
     WHERE o.login_id IS NULL 

的关键是使用LEFT JOIN与WHERE ... IS NULL条件。换句话说,您专门查找login表中的行,该表中没有“orders”表中的任何“扩展”信息。

这只是一个一般的描述,但我希望它应该有助于您构建特定于您的案例的大型查询过程。 )

+1

+1是因为只有在应该写作大写时才会写上大写字母的人。 – gosukiwi

0

尝试:

select login.loginFirstName, login.loginLastName, login.loginEmailAddress 
FROM login 
LEFT OUTER JOIN orders ON login.loginID = orders.OrderuserID 
WHERE orders.OrderuserID IS NULL; 

或类似的东西。我怀疑新的SQL用户的技巧是LEFT OUTER连接。没有该说明符,如果第二个表中有匹配,则联接将仅返回第一个表中的行。这样你可以得到它们(然后用IS NULL短语过滤出匹配)。

0

虽然你应该先尝试自己,你可以搜索谷歌第一:) :)。
不管怎么说,你可以以这种方式使用它,

SELECT l.loginFirstName,l.loginLastName, 
l.loginEmailAddress FROM login AS l LEFT JOIN orders as o 
ON l.loginID = o.OrderuserID where OrderuserID is NULL