2013-10-14 5 views
5

मुझे कुछ तालिकाओं के बीच आंतरिक जुड़ने के दौरान डुप्लिकेट फेंकने वाली क्वेरी के साथ कुछ समस्याएं आ रही हैं।एसक्यूएल एकाधिक तालिका डुप्लिकेट फेंकने में शामिल हों

अनिवार्य रूप से, मैं वीडियो के आधार पर कुछ टैग, और चैनल (सोच शैली) में शामिल हो रहा हूं इसलिए एक विशेष वीडियो फ़ाइल में एकाधिक टैग हो सकते हैं और कई चैनलों का हिस्सा हो सकते हैं।

दुर्भाग्य से, कई मैचों में दिखाई देता है :(मेरा आंत महसूस यह है कि क्वेरी प्रत्येक वीडियो के लिए वीडियो के साथ मेल खाती है और डबल अप को थूकती है (जैसा कि आप लिंक किए गए पहेली में देखेंगे, लेकिन यह देखते हुए कि मेरे ग्रैंड कुल एसक्यूएल अनुभव में शामिल हों लगभग 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; 

Am मैं इस बारे में सही रास्ते पर जा रहा? क्या इस तरह की क्वेरी को संरचित करने के तरीके के बारे में सिर्फ एक मौलिक गलती है? या जो मैं पूरा करने की कोशिश कर रहा हूं उसके लिए स्कीमा गलत है।

किसी भी मदद की सराहना की जाएगी!

@J लो उत्तर के लिए धन्यवाद!

उत्तर: DISTINCT कीवर्ड, मैं इसे का चयन करें बयान में कोशिश की, लेकिन इसके उपयोग के रूप में अनिश्चित थे, तो पूरी तरह से सराहना नहीं की थी, जहां उसका उपयोग किया जा सकता है, @J लो तो संक्षेप बताया बाहर, मैं कर सकते हैं मेरी 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

यह mysql सही है? आपको इस मामले में एसक्यूएल-सर्वर टैग का उपयोग नहीं करना चाहिए। लेकिन आपके प्रश्न को बहुत अच्छी तरह तैयार करने के लिए धन्यवाद। – Szymon

+1

चीयर्स साथी, मैं बस सुझाए गए टैग के साथ गया, उन्हें थोड़ा और करीब से पढ़ना चाहिए था। – splintex

उत्तर

3

आपका पहला जोड़ी मिलती है (वीडियो/VideoTags/टैग) पैदावार एक मेज तो जैसे:

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 के लिए ऊपर प्रविष्टियों एक अलग विशेषता

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

मैं दिखाए गए परिणाम सेट में टैग समूह और चैनल समूह को चाहता था ** [यहां] (http://www.sqlfiddle.com/#!2/765385/1/0) ** लेकिन डबल अप के बिना हो रहे हैं मुझे लगता है कि मैं अभी अपने सिर में भ्रमित हो गया हूं कि जॉइन कैसे काम करते हैं। मैं एक विशेष वीडियो फ़ाइल के साथ-साथ सभी ** चैनल ** से जुड़े सभी ** टैग्स ** को पुनर्प्राप्त करना चाहता हूं, जो इसका हिस्सा है। SQLFiddle लिंक आपको बहुत कुछ देगा जो मैं इसे दिखाना चाहता हूं। जवाब देने का समय निकालने के लिए धन्यवाद। – splintex

+0

@ जे लो धन्यवाद! पेड़ के लिए वन मुझे लगता है, मैंने DISTINCT की कोशिश की लेकिन गलत जगह पर। इसके उपयोग के बारे में कुछ और पढ़ना चाहिए था। मुझे कम क्रम में हल किया, और फिर, बहुत धन्यवाद। – splintex

संबंधित मुद्दे