当前位置: 首页 > 面试题库 >

从3个表中提取MySQL数据-联接和最大值

徐佐
2023-03-14
问题内容

我有三个mysql表,我想从中提取一些信息,这些表是:

  • 视频-代表带有分数的视频。
  • 标签-包含标签的全局列表。
  • VideoTags在视频和标签之间创建关联。

我想做的就是找到每个标签的得分最高的视频。有许多具有相同标签的视频,但是我的结果集将具有与标签相同的行数。最终目标是为每个唯一标签(标签是主题加上哈希值)提供最佳视频列表(按得分)。

我的SQL noob尝试实现此目标的方法如下:

  SELECT video.id AS video_id, video.owner_id, MAX(video.points), tag.id AS tag_id
    FROM Videos video, VideoTags videotag, Tags tag
   WHERE video.id = videotag.video_id
     AND videotag.tag_id = tag.id
     AND tag.content LIKE '#%'
GROUP BY tag.id

这是模式和示例数据:

DROP TABLE IF EXISTS `Video`;
CREATE TABLE `Video` (
  `id` varchar(24) NOT NULL default '',
  `owner_id` varchar(24) NOT NULL default '',
  `points` DOUBLE NOT NULL default 0
);

DROP TABLE IF EXISTS `Tags`;
CREATE TABLE `Tags` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `content` varchar(32) NOT NULL default ''
PRIMARY KEY (id)
);

DROP TABLE IF EXISTS `VideoTags`;
CREATE TABLE `VideoTags` (
  `video_id` varchar(24) NOT NULL default '',
  `tag_id` int(11) NOT NULL
);

INSERT INTO Videos (id,owner_id,points) VALUES ('owner-x-video-a','owner-x', 20);
INSERT INTO Videos (id,owner_id,points) VALUES ('owner-x-video-b','owner-x', 15);
INSERT INTO Videos (id,owner_id,points) VALUES ('owner-y-video-k','owner-y', 12);
INSERT INTO Videos (id,owner_id,points) VALUES ('owner-y-video-l','owner-y', 17);
INSERT INTO Videos (id,owner_id,points) VALUES ('owner-y-video-m','owner-y', 44);

INSERT INTO Tags (id, content) VALUES (111, '#topic-1');
INSERT INTO Tags (id, content) VALUES (222, '#topic-2');

INSERT INTO VideoTags (video_id,tag_id) VALUES ('owner-x-video-a',111);
INSERT INTO VideoTags (video_id,tag_id) VALUES ('owner-x-video-b',111);
INSERT INTO VideoTags (video_id,tag_id) VALUES ('owner-y-video-k',111);
INSERT INTO VideoTags (video_id,tag_id) VALUES ('owner-y-video-l',222);
INSERT INTO VideoTags (video_id,tag_id) VALUES ('owner-y-video-m',222);

我希望看到的是:

video_id          owner_id    MAX(video.points)  tag_id
owner-x-video-a   owner-x     20                 111
owner-y-video-m   owner-y     44                 222

但是我得到的是:

video_id          owner_id    MAX(video.points)  tag_id
owner-x-video-a   owner-x     20                 111
owner-y-video-l   owner-y     44                 222

不幸的是,第二行的video_id并非我所期望的,因为owner-y-video-
l没有44分,而是17分,因此对于ID为222的标签而言,得分最高的视频不是。

那里有SQL Universe大师可以帮助我吗?太感谢了 :)


问题答案:

您想要按组的最大值:

SELECT * FROM Video JOIN (

  SELECT   VideoTags.tag_id, MAX(points) points
  FROM     Video JOIN VideoTags ON Video.id = VideoTags.video_id
  GROUP BY VideoTags.tag_id

) t USING (points) JOIN Tags ON t.tag_id = Tags.id

在sqlfiddle上看到它。

请注意,此查询返回的是每个标签中具有最大点数的 所有
视频,因此对于绑定的标签,将返回多个记录。在这种情况下,如果您只希望返回一条记录,请指定如何确定应返回的视频。



 类似资料:
  • 问题内容: 这是我正在谈论的简化示例: 为了这个问题,假设每个学生至少记录了一个考试结果。 您将如何选择每个学生以及他们的最高分数? 编辑 :…和该记录中的其他字段? 预期产量: 欢迎使用所有类型的DBMS进行回答。 问题答案: 回答已编辑的问题(即也获取关联的列)。 在Sql Server 2005+中,最好的方法是将等级/窗口函数与CTE结合使用,如下所示: 对于符合ANSI-SQL的解决方案

  • 问题内容: 我知道核心数据不是数据库,并且有很多差异。是这个吗? 在数据库中,我通常有以下内容 A->> B->> C “ A”有很多“ B”,其中有很多“ C” 查询“给我所有具有c.attr =’X’的A可以很容易地写成: 在Core Data中,我想做同样的事情,但是要使用类似这样的谓词: 这样做会导致错误:“ NSInvalidArgumentException”,原因:“此处不允许使用多

  • 问题内容: 我有两个表帐户和余额 我想加入这两个表并获取特定cid的最大日期余额。 输出结果为- 问题答案: 您需要使用两个子查询,如下所示: 输出: 客户编号 姓名 移动的 日期 平衡 1个 美国广播公司 12345 2013年9月20日00:00:00 + 0000 300 2个 XYZ 98475 2013年9月21日00:00:00 + 0000 600 看到这个SQLFiddle

  • 我在MySQL中有两个表,如下所示: 表1如下: 表2如下: 现在,我想在一个查询中同时从表1和表2获取数据。 我想从两个表中检索值,其中Student ID等于某物。 学生姓名|年龄|教师姓名 您能告诉我如何从上面提到的两个表中查询值吗。我已经阅读了很多教程,但我不能正确地检索它。我是MySQL新手,请解释清楚。我应该使用什么表联接、并集、内部联接还是外部联接?

  • 问题内容: 我正在寻找一种在Linux Shell环境中从HTML获取某些信息的方法。 这是我感兴趣的一点: 我想将它们存储在shell变量中或在从html上面提取的键值对中回显这些变量。范例: 目前,我可以做的是创建一个Java程序,该程序将使用sax解析器或html解析器(例如jsoup)来提取此信息。 但是在这里使用Java似乎很麻烦,因为要在您要执行的“包装器”脚本中包含可运行的jar。

  • 我正在尝试使用JPA查询使用以下查询从DB中获取数据: 其中,id=candidate_id(主表的主键)。 该查询也从其所有关联表中获取数据,而我的要求是仅从其2个关联表中获取数据。因为第三个表包含大量JSON数据,这会降低上述查询的响应时间。 我尝试使用JOIN,获取父级的JOIN及其2个关联表,但它不起作用。我还在研究如何在获取候选数据时只跳过一列数据(带有大量JSON的第3个表的列),但运