Java MYSQL使用group by和order by进行单个查询以获取计数(不同的列名)

Java MYSQL使用group by和order by进行单个查询以获取计数(不同的列名),java,mysql,Java,Mysql,我有一个实体类 public class TeklaEventE { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Integer id; private Integer projectId; private Integer drawingId; private Integer userId; private String eventType; private

我有一个实体类

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
}
我想通过按eventDate排序对projectId进行分组来获得*,COUNTDISTINCT用户ID

我试着回答以下问题

按projectId order by eventDate desc从teklaevent组中选择*,COUNTDISTINCT userId作为noOfUser; 它给出了正确的计数,但它首先运行group,然后运行order by,但我需要具有不同projectId的最新行。然后我按照建议尝试第二个查询

选择*FROM TeklaEvent,其中id在select maxid FROM TeklaEvent group by projectId order by eventDate desc中;它提供了我所需要的完美行,因为eventDate始终是当前日期。但当我试图从下面的查询中获取COUNTDISTINCT用户ID时

select*,COUNTDISTINCT userId作为TeklaEvent中的noOfUser,其中id在select maxid FROM TeklaEvent组中按projectd 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
这对我很有用:

select a.*, t.noOfUser
from teklaevent a
inner join (
  select max(id) maxid, count(distinct userId) noOfUser
  from  teklaevent
  group by projectId
) t on a.id = t.maxid;

使用“分组依据”时不能执行“选择*”。这是没有意义的,所以重新想想你想做什么。原因:GROUP BY projectId意味着每个不同的projectId值只返回一行,但由于表中可能有许多行具有相同的projectId值,因此应该返回drawingId等多个值中的哪一个?我相信第三个选项正确使用GROUP BY。也许ORDER BY eventDate desc只需要移动到子查询中?哦,但是计数不同没有意义,计数不同需要在子查询中,并且您可能需要加入子查询。这不起作用。。通过a.projectId=t.projectId上的projectId t从teklaevent a内部联接选择projectId,从teklaevent组中选择一个*,t.noOfUser;它返回所有行该工作从teklaevent中选择一个*,t.noOfUser内部连接从teklaevent组中选择maxid maxid,countdistinct userId noOfUser,通过a.id=t.maxid上的projectId t;