2013-12-11 49 views
1

我有一个用户表,称为..等待它...“用户”..然后另一个表记录用户的活动叫...你永远不会猜测.. 。“activity”..MySQL,结合DISTINCT和JOIN

我有一个HTML表格,它显示了users表中的用户,但我想按用户上次的活动排序表。

这是我的查询。

SELECT * 
FROM `users` 
JOIN `activity` 
    ON `activity`.`user_id` = `users`.`id` 
    ORDER BY `activity`.`timestamp` 
     LIMIT 25 

这里的问题是,它显示了每个用户的多个行,因为有在activity表中的每个用户的多条记录。

如何更改查询以仅为每个用户显示一条记录并按活动表中的最后一个活动排序。

我做实验使用“DISTINCT”关键字,但没有运气:/

+0

您可以选择不同的用户名像 DISTINCT() – uvais

+1

我的活动表的猜测是“活动” ... – irla

回答

2

“吗?在活动表中的每个用户,并命令他们在最后一个活动记录”

Couly试试这个吗?假设你需要用户信息和活动信息。

SELECT users.*, a.* 
FROM users INNER JOIN (
    SELECT user_id, MAX(timestamp) max_timestamp 
    FROM activity 
    GROUP BY user_id 
) x ON users.user_id = x.user_id 
INNER JOIN activity a ON x.user_id = a.user_id AND a.timestamp = x.max_timestamp 
ORDER BY a.timestamp; 

内部子查询查找max_timestamp每USER_ID和OUTER JOIN发现活动有max_timestamp和user_id说明

+0

了一些小错误,但这个是多了还是少了什么我要找的。非常感谢! –

+0

@费城对不起,错误!并感谢您接受我的回答! –

0

这不是SQL的解决方案,但我会做的是保持lastActivity列在用户表时更新需要。然后排序,通过这个列过滤将非常简单和高效。

+0

你是完全正确的,但在开发阶段的这一点上,这将是更多的工作。 –

+0

是的,它完全取决于你在哪里使用它,如果它必须是有效的。如果不是SQL解决方案最简单。 – irla