你可以这样做:
SELECT * FROM (
SELECT
user_id
,ip,
,login_date
,IF(@user_id = SESSION_GRUOPED.user_id, @rownum:[email protected]+1, @rownum:=1) as row_id
,(@user_id:= SESSION_GRUOPED.user_id) as group_id
FROM (
SELECT user_id, ip, max(login_date) login_date FROM SESSION group by user_id, ip order by user_id, login_date desc
) SESSION_GRUOPED
JOIN (SELECT @rownum := 0) r
JOIN (select @user_id := 0) u
) RESULT
WHERE row_id < 4;
查询的关键是这部分
SELECT user_id, ip, max(login_date) login_date FROM SESSION group by user_id, ip order by user_id, login_date desc
多亏了它,你获取有关信息最后一次每个用户给定的IP地址。
然后,您可以将此设置为在组中设置结果编号,然后将结果限制为小于4的结果,因为对于单个用户只需要三个结果。
注意:如果将row_id < 4更改为row_id = 1,那么您将拥有最新的用户登录名。
你能告诉你“非常非常非常丑陋,无效,耗时”吗? – Raptor
我从此表保存到文件唯一用户标识。然后,对于每个uid,我获得所有会话,按登录日期DESC对其进行排序并插入临时表中。第一行将包含最后一个会话,我从中选择group_concat(ip)(从temp_table limit 3中选择不同的ip) –
这里的解决方案比你的稍好:http://sqlfiddle.com/#!2/9d65d/3。它仍然需要您的客户端代码遍历所有user_id。我确信有一种方法可以在单个查询中实现您要查找的内容。我只是不知道。 – xbonez