2012-07-23 79 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