【问题标题】:Group rows by value but only displaying the newest row in group result按值对行进行分组,但仅显示分组结果中的最新行
【发布时间】:2013-07-23 20:15:04
【问题描述】:

我希望我的标题措辞正确,但如果它令人困惑,我会解释我想要达到的目标。

在我的 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 个(按时间戳的最新提交)。

【问题讨论】:

    标签: mysql greatest-n-per-group


    【解决方案1】:
    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  
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 返回所有未批准应用程序的计数,但我需要它来对 user_id 进行分组,因为某些用户有不止一行
      【解决方案3】:

      试试这个:

      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;
      

      【讨论】:

      • 计算所有未批准的行,但不按 user_id 对结果进行分组,因此计算重复项。 EDIT 使用您编辑的代码,它仍然返回相同的结果。
      • @Trendee Now?这是你想要的吗?
      • @Trendee 抱歉,我没有实际数据来测试它。试试上面的
      【解决方案4】:

      试试这个:

      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 和 (*) 之间的空格

      【讨论】:

      • #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 ') FROM applications WHERE approved = 0 GROUP BY user_id HAVING COUNT() > ' 附近使用正确的语法
      • 我建议对您的帖子进行编辑以使其正常工作,这符合我的需要。但是我如何计算所有返回的行(每个用户仍然 1)
      • @Trendee 感谢您的编辑,您想要此结果的总行数吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-09
      • 2012-10-06
      • 1970-01-01
      • 2012-09-19
      • 2021-05-08
      • 2021-12-09
      相关资源
      最近更新 更多