按值对行进行分组,但仅显示组结果中的最新行

时间:2013-07-23 20:15:05

标签: mysql greatest-n-per-group

我希望我能正确地说出这个标题,但如果它令人困惑,我会解释我想要实现的目标。

在我的webapp中,用户需要在加入之前发送应用程序。当用户更改其应用程序而不是更新当前行时,我决​​定插入一个新行,以便用户可以返回过去的版本。

所以我要说我的表看起来像这样

id  |  user_id  | approved  |  timestamp

如何在不显示user_id副本的情况下计算有多少未批准的应用程序?

我目前有这个

SELECT * FROM `applications` WHERE approved = 0 GROUP BY user_id 

现在我不知道这是否是解决此问题的正确方法,但经过一些在线研究后,这是我可以放在一起的最佳方法,这将返回user_id分组但显示用户最旧的数据。

(计算结果的查询或显示每个未批准用户的应用程序的整行是我所追求的)

修改

要清理,请说

用户1已编辑其应用程序3次。 (总共4行)

用户2已编辑了2次应用程序。 (总共3行)

我如何从所有用户获得未批准的应用程序的数量,但每个用户只计算1(按时间戳的最新提交)。

4 个答案:

答案 0 :(得分:0)

试试这个:

SELECT user_id,count(user_id),timestamp from (SELECT DISTINCT user_id, COUNT(user_id),timestamp FROM applications WHERE approved =0 ORDER BY timestamp DESC) AS temp;

答案 1 :(得分:0)

我认为你的方式是最好的方式。您也可以使用distinct与嵌套连接。但是如果你使用

SELECT DISTINCT COUNT(*) FROM applications WHERE approved =0 ORDER BY timestamp DESC

您将无法获得用户的所有信息。

答案 2 :(得分:0)

试试这个:

SELECT user_id, MAX(timestamp), COUNT(*), (SELECT COUNT(*) FROM `applications` WHERE approved = 0)
FROM `applications` 
WHERE approved = 0 
GROUP BY user_id 
HAVING COUNT(*) > 1

在COUNT和(*)

之间编辑了空格

答案 3 :(得分:0)

SELECT 
  user_id,
  COUNT(user_id) total_apps, 
  SUM(case  when approved = 0 then 1 else 0 ) unapproved_apps 
FROM applications
GROUP BY user_id