回答

收藏

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

技术问答 技术问答 208 人阅读 | 0 人回复 | 2023-09-12

我有三个mysql表,我想从中提取一些信息,这些表是:7 ?; B' q) ~' j3 i% c
视频-代表有分数的视频。
5 ^2 G  U* P. ~3 R4 ^9 q( ?2 M标签-包含标签的全局列表。
1 [9 j$ O; R& i2 X0 mVideoTags在视频和标签之间创建联系。
我想做的是找到每个标签得分最高的视频。有很多标签相同的视频,但我的结果集将有与标签相同的行数。最终目标是为每个标签提供最佳视频列表(标签是主题和哈希值)。
# k% D* A! F+ C' T& A: K2 e. v% x我的SQL noob如下:
, C$ q0 x' ]6 H0 P8 o        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这是模式和示例数据:
/ H* h# X4 ^6 C5 u2 ZDROP 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);我想看到的是:8 Y0 {0 h# a* n, b
video_id          owner_id    MAX(video.points)  tag_idowner-x-video-a   owner-x    20                     1111111owner-y-video-m   owner-y    444                             但我得到的是:! |" d# j2 j! S$ p& n7 S% v* f
video_id          owner_id    MAX(video.points)  tag_idowner-x-video-a   owner-x    20                     1111111owner-y-video-l   owner-y    444                             不幸的是,第二行video_id不是我所期待的,因为owner-y-video-+ j3 P9 g$ l: r0 `, s4 K# g3 c! l
l没有44分,而是17分,因此对于ID对于222标签,得分最高的视频不是。- K" o; Y! F: {5 }* u2 K( X
那里有SQL Universe大师能帮我吗?非常感谢 )2 o& Z6 k+ `' R8 i+ y0 ~
                                                               
1 n! h$ {$ X1 A/ O& V    解决方案:                                                               
1 f, O3 p- H: R% B8 t6 y                                                                按组最大值:
  v5 t& T7 f  l: T( r6 M' nSELECT * 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上看到它。
; z2 @* S8 C9 t& a6 w2 w- n1 m2 r' q  g请注意,这个查询返回的是每个标签中最大点的 所有# S2 }; Y  d& n" ?+ n- N
因此,对于绑定标签,将返回多个记录。在这种情况下,如果您只想返回一个记录,请指定如何确定应返回的视频。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则