加入记录以获得最新信息

时间:2012-07-23 21:25:19

标签: mysql

我有桌子:

用户

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

但是这为Johnny创造了两条记录,因为销售中有两条记录。有什么想法吗?

4 个答案:

答案 0 :(得分:0)

选择u.id作为id,u.first_name作为first_name,u.last_name作为last_name,MAX(s.date)作为date 来自用户,因为您在u.id = s.user_id上的LEFT JOIN销售 GROUP BY id

查看此链接,了解每组查询结构中更复杂的前N个。

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

答案 1 :(得分: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;

这是最接近“最后一笔交易”而没有时间的

答案 2 :(得分: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

编辑:如果您将日期设为TIMESTAMP,则可以在MAX()中使用它而不是id。如果您将其保留为日期,您仍然可以使用它,但是如果一天内有多个用户销售,您将获得额外的记录

答案 3 :(得分: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服务器来测试它,如果它有任何错误,只需回发。