当我在某些表之间进行内部联接时,我遇到了一些抛出欺骗的问题。
基本上,我正在加入一些基于videoId的标签和频道(思考类型),因此特定的视频文件可以包含多个标签并成为多个频道的一部分。
不幸的是,出现了多个匹配:(我的直觉是,查询与每个连接的videoId匹配并吐出双倍(正如您将在链接的小提琴中看到的那样,但考虑到我的SQL加入的总数)经验是从大约3个小时前到目前为止,我已经设法混乱,但现在可以做一些专家建议,从这里去哪里。
以下是我一直在努力解决的架构和查询,这里是sqlfiddle链接,
架构:
create table videos
(
videoId int(1) AUTO_INCREMENT,
videoUUID char(40),
contentFolder varchar(50),
title varchar(50),
caption varchar(50),
duration varchar(15),
date TIMESTAMP,
url varchar(55),
text varchar(250),
PRIMARY KEY (videoId)
);
create table tags
(
tagId int(1) AUTO_INCREMENT,
tagName varchar(15),
PRIMARY KEY (tagId)
);
create table channels
(
channelId int(1) AUTO_INCREMENT,
channelName varchar(15),
PRIMARY KEY (channelId)
);
create table videoTags
(
videoTagId int(1) AUTO_INCREMENT,
videoId int(1),
tagId int(1),
PRIMARY KEY (videoTagId)
);
create table videoChannels
(
videoChannelId int(1) AUTO_INCREMENT,
videoId int (1),
channelId int (1),
PRIMARY KEY (videoChannelId)
);
//
create trigger tuuid before insert on videos
for each row begin
set new.videoUUID = uuid();
end//
insert into videos
(contentFolder, title,caption,duration,url,text)
values ("someDir/","A Movie Title", "Headline for Movie",
"00:05:11",
"http://someserver.ip/somedir/test.mp4",
"Some text as part of the video file description here");
insert into tags (tagName) values
('Flowers'),('Dogs'),('Cats'),('YaMum'),('orlyowl');
insert into channels (channelName) values
('General'), ('NotSoGeneral'), ('Specific'), ('Broad'), ('Narrow'),
('Obsolete');
insert into videoTags (videoId,tagId) values
(1,2),(1,5);
insert into videoChannels (videoId,channelId) values
(1,1),(1,4),(1,6);
查询:
select distinct v.*,group_concat(t.tagName)Tags,
group_concat(c.channelName)Channels
from videos as v
inner join videoTags as vt on v.videoId = vt.videoid
inner join tags as t on t.tagId = vt.tagId
inner join videoChannels as vc on v.videoId = vc.videoId
inner join channels as c on c.channelId = vc.channelId
group by v.videoId;
我是以正确的方式来做这件事的吗?我构建查询的方式是否存在根本的错误?或者说我想要完成的模式是错误的。
非常感谢任何帮助!
@J Lo谢谢你的回答!
答案: DISTINCT关键字,我在select语句中尝试过,但不确定它的用法,所以没有完全理解它可以在哪里使用,@ J Lo如此简洁地指出,我可以在我的group_concat中使用它,从而给出了查询:
select v.*,group_concat(distinct t.tagName)Tags,
group_concat(distinct c.channelName)Channels
from videos as v
inner join videoTags as vt on v.videoId = vt.videoid
inner join tags as t on t.tagId = vt.tagId
inner join videoChannels as vc on v.videoId = vc.videoId
inner join channels as c on c.channelId = vc.channelId
group by v.videoId;
答案 0 :(得分:3)
你的第一对夫妇加入(视频/视频标签/标签)产生如下表格:
VideoID = 1 will bring in TagID = 2,5 (Dogs, orlyowl) so you have this
| 1 | Dogs
| 1 | orlyowl
当您加入VideoChannels时,它会复制每个频道的上述条目
| 1 | Dogs | 1
| 1 | orlyowl | 1
| 1 | Dogs | 4
| 1 | orlyowl | 4
| 1 | Dogs | 6
| 1 | orlyowl | 6
group_concat具有DISTINCT属性
select v.*
, group_concat(distinct t.tagName) Tags
, group_concat(distinct c.channelName) Channels
from videos as v
inner join videoTags as vt on v.videoId = vt.videoid
inner join tags as t on t.tagId = vt.tagId
inner join videoChannels as vc on v.videoId = vc.videoId
inner join channels as c on c.channelId = vc.channelId
group by v.videoId;