Java 查询多对多关系中的值之和

Java 查询多对多关系中的值之和,java,mysql,sql,database,jpa,Java,Mysql,Sql,Database,Jpa,我的模型如下: table video: int id (PK) int views table tag: int id (PK) table video_tag: int id (PK) int video_id (FK to video.id) int tag_id (FK to tag.id) 该模型描述了标签和视频之间的多对多关系。一个视频可以有多个描述其内容的标签。它还有一个包含视图数的字段。同一标签也可以引用多个视频 我想构建一个查询(最好是在JPA/JPQL/HQL中,但是S

我的模型如下:

table video:
int id (PK)
int views

table tag:
int id (PK)

table video_tag:
int id (PK)
int video_id (FK to video.id)
int tag_id (FK to tag.id)
该模型描述了标签和视频之间的多对多关系。一个视频可以有多个描述其内容的标签。它还有一个包含视图数的字段。同一标签也可以引用多个视频

我想构建一个查询(最好是在JPA/JPQL/HQL中,但是SQL也可以),它返回所有标记,这些标记按照它们所引用的视频的视图总数排序

例如:两个视频videoA和videoB都有Foo标签。VideoA有2个视图,videoB有3个视图。标记Foo的排序编号为5

以下是使用JPA的两种尝试:

@Query("SELECT t FROM Tag t, SUM(v.views) as viewCount FROM Video v WHERE t MEMBER OF v.tags ORDER BY viewCount DESC")
@Query("SELECT t FROM (SELECT t, SUM(v.views) as viewCount FROM Tag t, Video v WHERE t MEMBER OF v.tags) ORDER BY viewCount DESC")
尝试使用SQL:

select t.id, sum(v.views) from tag t, video v where t.id in (select vt.tag_id from video_tag vt where vt.tag_id=t.id and vt.video_id=v.id)

在三个表之间进行简单的
join
groupby
应该可以:

select t.id, t.label, sum(views)
from video_tag as vt
inner join video as v on v.id = vt.video_id
inner join tag as t on t.id = vt.tag_id
group by t.id, t.label
;

看到它在这里运行:

被否决,因为它根本没有显示任何努力。我添加了两次尝试,将查询限制为JPAI,还发现JPA查询做了相同的事情(甚至更短:))从标记中选择t加入FETCH t.videos v GROUP BY t ORDER BY SUM(v.views)DESC