2012-07-23 76 views
0

我有表:加入紀錄獲得最新

用戶

id | first_name | last_name 
1 Johnny  Steve 
2 Kim   Borden 

銷售

id | user_id | service_id | date 
1 1   2   2012-02-12 
2 1   6   2012-04-21 

我想與他們連接最近的銷售信息檢索用戶列表。如果沒有找到,則返回NULL。

我有什麼至今:

SELECT 
    users.*, 
    sales.*, 
FROM 
    users 
LEFT JOIN 
    sales ON users.id=sales.user_id 

但是這創造了兩個記錄,因爲這兩個銷售的約翰尼。有任何想法嗎?

+0

您是否一次只查找一個用戶,或試圖獲取所有用戶的最新銷售記錄? – 2012-07-23 21:28:41

+0

我期望獲得表中所有用戶的列表,其中包含最近銷售的銷售信息。 – user622469 2012-07-23 21:30:25

回答

0

選擇u.id爲ID,u.first_name爲FIRST_NAME,u.last_name作爲姓氏,MAX(s.date)作爲date 從用戶爲u留在u.id = s.user_id JOIN銷售爲s GROUP BY ID

查看此鏈接,查看更復雜的前N個每組類型的查詢結構。

http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

+0

我如何獲得最新的service_id? – user622469 2012-07-23 21:35:17

+0

是絕對必需的東西嗎?因爲如果您需要使用單個查詢獲取所有用戶數據,這樣做會使查詢變得更加複雜。 – 2012-07-23 21:37:34

+0

是的,我需要銷售的所有列,這些列比service_id多。 – user622469 2012-07-23 21:45:09

0
SELECT 
     u.*, 
     SUBSTRING_INDEX(GROUP_CONCAT(s.id ORDER BY s.date DESC,s.id DESC),',',1) as sale_id, 
     SUBSTRING_INDEX(GROUP_CONCAT(s.service_id ORDER BY s.date DESC,s.id DESC),',',1) as service_id, 
     SUBSTRING_INDEX(GROUP_CONCAT(s.date ORDER BY s.date DESC,s.id DESC),',',1) as sale_date 
FROM users u 
LEFT JOIN sales s ON s.user_id = u.id 
GROUP BY u.id; 

這是你可以得到「最後的出售」,而無需時間

+0

只是因爲autoincrement id更高,並不意味着日期是最近的。但是,您需要在子查詢中自行將銷售表加入自己,以獲取每個用戶的最新日期。 – 2012-07-23 21:44:19

+0

@MikeBrant日期列值不包括時間,所以這不起作用。 – Andy 2012-07-23 21:48:50

0
SELECT u.*, s.*, 
    FROM users u 
    LEFT JOIN 
(select max(id) as sales_id, user_id from sales group by user_id) sa 
on sa.user_id = u.id 
    LEFT JOIN sales s ON sa.user_id=s.user_id and s.id=sa.sales_id 

編輯最接近的:如果你把日期時間印可以用它代替身份證在MAX()中。如果你保留它作爲日期,你仍然可以使用它,但是如果在一天內有多個用戶的銷售,你將獲得額外的記錄。

0

沒有使用分析函數,這是一個非常基本的方法做你想做什麼:

select users.*, sales.* 
from users, 
(select a.* 
    from sales a, 
     (select user_id, MAX(date) as mostRecentDate 
     from sales 
     group by user_id) b 
    where a.user_id = b.user_id 
     and a.date = b.mostRecentDate) sales 
where users.id = sales.user_id; 

我沒有在時刻提供給我一個MySQL服務器來測試這一點,如果它使任何錯誤,只是後回。

+0

通過查看您的其他評論,此查詢可能會解決您的問題。我只擔心銷售子查詢中的別名,但應該很容易解決。 這應該會爲您提供銷售和用戶的所有欄目。 – Hermit 2012-07-23 22:00:54