java - 查询多对多关系中某个值的总和

标签 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)

该模型描述了标签和视频之间的多对多关系。视频可以有多个描述其内容的标签。它还具有一个包含 View 数的字段。同一标签还可以引用多个视频。

我想构建一个查询(最好在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)

最佳答案

三个表之间的简单连接group by应该可以工作:

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
;

在这里查看它的运行情况:http://sqlfiddle.com/#!9/e366a0/1

关于java - 查询多对多关系中某个值的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35047291/

相关文章:

java - 为什么简单 RMI 服务器需要代码库?

c# - 使用 asp.net c# MySQL INSERT INTO Query 中的神秘错误

MySQL 通过固定表引用更轻松地连接

sql - 1 个 Sql Azure 数据库中可以有多少个表

mysql触发器不插入选定的列

java - 如何计算具有特定值和特定用户/人(行中)的数据?

java - 如果是包装类,应该如何处理异常?

java - 尝试制作动画时在 Java3D 中丢失旋转

mysql - 如何添加子选择查询

java - 如何将数组的元素相加到目标数?