我有桌子:
用户
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创造了两条记录,因为销售中有两条记录。有什么想法吗?
答案 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服务器来测试它,如果它有任何错误,只需回发。