2016-07-29 89 views
1
+------+---------+--------+---------+---------+---------+ 
| id | user_id | obj_id | created | applied | content | 
+------+---------+--------+---------+---------+---------+ 
| 1 |  1 |  1 |  1 |  1 | ...  | 
| 2 |  1 |  2 |  1 |  1 | ...  | 
| 3 |  1 |  1 |  1 |  2 | ...  | 
| 4 |  1 |  2 |  2 |  2 | ...  | 
| 5 |  2 |  1 |  1 |  1 | ...  | 
| 6 |  2 |  2 |  1 |  1 | ...  | 
+------+---------+--------+---------+---------+---------+ 

我有一个类似于上面的表。 id,user_idobj_id是外键; createdapplied是存储为整数的时间戳。我需要获得整行,按user_idobj_id分组,最大值为applied。如果两行具有相同的applied值,则需要支持最大值created。因此,对于上述数据,我需要的输出是:MySQL获得最大列与回退到第二列

+------+---------+--------+---------+---------+---------+ 
| id | user_id | obj_id | created | applied | content | 
+------+---------+--------+---------+---------+---------+ 
| 1 |  1 |  1 |  1 |  1 | ...  | 
| 4 |  1 |  2 |  2 |  2 | ...  | 
| 5 |  2 |  1 |  1 |  1 | ...  | 
| 6 |  2 |  2 |  1 |  1 | ...  | 
+------+---------+--------+---------+---------+---------+ 

我目前的解决办法是让一切由applied下令然后created

select * from data order by applied desc created desc; 

,事情出在代码排序,但此表获取相当大,我想要一个SQL解决方案,获取我需要的数据。

+0

➕1为ASCII艺术;但为了CVE:请添加您的初始查询。 –

+0

@LinusKleen你是什么意思?我目前正在使用的查询或查询来复制上述数据? –

+0

对不起。 “初始”如:“让你烦恼的人”。 –

回答

0

感谢马克海因茨在评论中,this answer让我到我需要的地方。

SELECT 
    data.id, 
    data.user_id, 
    data.obj_id, 
    data.created, 
    data.applied, 
    data.content 
FROM data 
LEFT JOIN data next_max_applied ON 
    next_max_applied.user_id = data.user_id AND 
    next_max_applied.obj_id = data.obj_id AND (
     next_max_applied.applied > data.applied OR (
      next_max_applied.applied = data.applied AND 
      next_max_applied.created > data.created 
     ) 
    ) 
WHERE next_max_applied.applied IS NULL 
GROUP BY user_id, obj_id; 

请仔细阅读答案,了解它的工作原理; left join会尝试为同一用户和对象查找最近应用的行。如果没有一个,它会发现一行同时应用,但最近创建。

以上意思是任何没有更新行的行来替换它,都会有一个next_max_applied.applied值为null。这些行由IS NULL子句过滤。

最后,group by子句处理任何具有相同用户,对象,应用和创建列的行。

0
select * 
from my_table 
where id in (
    /* inner subquery b */ 
    select max(id) 
     from my_table where 
     (user_id, obj_id, applied, created) in (
      /* inner subquery A */ 
      select user_id, obj_id, max(applied), max(created) 
      from my_table 
      group by user_id, obj_id 
    ) 
); 

然后内部子查询A返回具有user_id, obj_id, max(applied), max(created)的(不同的)行。在in子句中使用这些子查询B查看单个ID的列表,每个ID都与具有适当值user_id,obj_id,max(applied),max(created)的行相关联。所以你有一个有效的ID集合来获得你的结果。

主要选择使用这些ID来选择您需要的结果。

+0

补充说明希望很明确 – scaisEdge