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;