2012-06-15 304 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