java - MYSQL 单查询获取 COUNT(DISTINCT columnName) 与 group by 和 order by
问题描述
我有一个实体类
public class TeklaEventE {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private Integer projectId;
private Integer drawingId;
private Integer userId;
private String eventType;
private LocalDateTime eventDate;
private LocalDateTime modifiedDate;
private String projectName;
private String userName;
private transient int noOfUser;
// getter setter
}
我想按顺序* , COUNT(DISTINCT userId)
分组projectId
eventDate
我尝试了以下查询
SELECT *,COUNT(DISTINCT userId) as noOfUser FROM teklaevent group by projectId order by eventDate desc;
它给出了正确的计数,但它首先运行group by
,order by
但我需要具有不同的最新行projectId
。然后我按照建议尝试第二个查询select * FROM TeklaEvent where id in (select max(id) FROM TeklaEvent group by projectId) order by eventDate desc;
它提供了我需要的完美行,因为eventDate
它始终是当前日期。但是当我尝试COUNT(DISTINCT userId)
从下面的查询中获取时。select *,COUNT(DISTINCT userId) as noOfUser FROM TeklaEvent where id in (select max(id) FROM TeklaEvent group by projectId) order by eventDate desc;
它没有给我正确的结果。
如何在单个查询中执行此操作?
解决方案
您可以在子选择上使用连接进行计数
select a.*, t.noOfUser
from teklaevent
inner join (
select projectId , count(distinct userId) noOfUser
from teklaevent
group by projectId
) t a.projectId = t.projectId
推荐阅读
- mysql - 当 SP 的实际代码在 10 分钟内直接执行时,为什么在超时开始之前存储过程永远不会返回?
- java - 项目单击侦听器不适用于自动滚动 Recyclerview
- php - 在为 cpt 创建自定义搜索时需要帮助
- node.js - 如何在 Dialogflow 的承诺中通知用户 POST 失败?
- sql-server - SqlException:“必须声明标量变量”在执行存储过程
- c# - 以前登录有效时,用户“ ”登录失败
- javascript - Cordova 文件插件无法删除文件
- c++ - Tensorflow Lite arm64 错误:无法转换'const int8x8_t?
- linkedin - 营销开发者平台访问请求被拒绝
- bash - 将文件重新分配到具有最大大小的多个子目录中