2011-12-01 48 views
0

基本模式(只顯示相關字段):MySQL的 - 查詢返回客戶的第一順序

客戶

id | fname | sname | email 

訂單

order_id | customer | level | timestamp 

,我需要選擇每一個客戶,但隨着他們的個人資料,我想加入他們的level第一個訂單。

SELECT c.fname, c.sname, c.email, o.level 
FROM customers c 
LEFT JOIN orders o ON c.id = o.customer 

..? 

編輯

到目前爲止我嘗試了兩種解決方案,他們完全殺死我的整個數據庫。運行查詢後沒有數據庫請求會完成,所以我想知道如果查詢可能太大。大約有10,000個訂單和15,000個客戶。這是預期的嗎?在這些桌子上我從來沒有遇到過這些問題。

回答

0

那麼,這將工作,但不是最優的:

SELECT c.fname, c.sname, c.email, o.level 
FROM customers c 
LEFT JOIN orders o ON c.id = o.customer 
WHERE o.`timestamp` = (SELECT MIN(o1.`timestamp`) FROM orders o1 WHERE o1.customer = c.id) 
GROUP BY c.id 
0
SELECT c.fname, c.sname, c.email, o.level 
FROM customers c 
LEFT JOIN orders o ON c.id = o.customer 
ORDER BY o.timestamp ASC LIMIT 1 
+0

這似乎已經殺死了我的數據庫,但我不知道爲什麼。該請求已運行近10分鐘。 – BadHorsie

+0

'LIMIT 1'告訴你只會得到一個結果行。只意味着一個客戶,而不是所有的客戶都有一個訂單。請參閱下面的查詢。希望它可以幫助你。 – yas375

+0

是的,我已經看到,但不幸的是我跑上面的查詢,訂單和客戶表似乎已經死亡。如果我嘗試在這兩個表的數據庫上運行任何查詢,它將永遠加載並永遠不會完成。我可以阻止它,如果我重新啓動服務器來終止進程,但這些表上的任何請求將再次殺死所有內容。我需要緊急解決這個問題。 – BadHorsie

0

嘗試此查詢 -

SELECT c.fname, c.sname, c.email, o.level FROM customers c 
    LEFT JOIN (
    SELECT o1.* FROM orders o1 
     JOIN (SELECT customer, MIN(timestamp) timestamp FROM orders GROUP BY customer) o2 
     ON o1.customer = o2.customer AND o1.timestamp = o2.timestamp) o 
    ON c.id = o.customer; 
+0

此查詢也殺死了我的數據庫。 – BadHorsie

+0

首先嚐試使用小數據集。你有order.customer,orders.timestamp,customers.id字段的索引嗎?他們應該提高性能。 – Devart

0
SELECT c.fname, c.sname, c.email, o.level 
FROM customers c 
LEFT JOIN orders o ON c.id = o.customer 
ORDER BY o.timestamp 
GROUP BY c.id 
+0

此查詢也殺死了我的數據庫。 – BadHorsie

+0

檢查表格的名稱。 '訂單'表中的字段'客戶'是整數嗎? – yas375

0

子選擇肯定不是最有效的,但這裏有一個查詢

SELECT c.fname, c.sname, c.email, o.level, 
    (select level from orders 
    where c.id = o.customer order by timestamp asc limit 0,1) as level 
FROM customers c 

這會給你所有的客戶(訂單與否)和他們相應的水平。如果你的表現很慢,請確保你有適當的索引