2008-12-20 14 views
9

पर "संबंधित वीडियो" क्वेरी पर सलाह की तलाश है, ठीक है, मैं एक छोटी वीडियो वेबसाइट चलाता हूं और वास्तविक वीडियो पेज पर अधिकांश वीडियो पक्षों (जैसे यूट्यूब) के समान "संबंधित वीडियो" की एक पट्टी होती है और वर्तमान में मैं जो कुछ कर रहा हूं वह अपने टैगों में से एक को यादृच्छिक रूप से ले रहा है और उसी टैग के साथ अन्य वीडियो ढूंढ रहा है। आश्चर्य की बात नहीं है कि यह एक शानदार तरीका नहीं है क्योंकि कुछ टैग बहुत अस्पष्ट हैं और कुछ वीडियो गलत टैग किए गए हैं। वर्तमान क्वेरी केटैग की गई वीडियो सिस्टम

उदाहरण:

SELECT video_name FROM videos INNER JOIN videotags ON videos.id=videotags.video_id INNER JOIN tags ON tags.id=videotags.tag_id WHERE tag_name='x' AND videos.id<>'y' LIMIT 5 

कहाँ एक्स मौजूदा वीडियो और y से टैग में से किसी एक है मौजूदा वीडियो से आईडी है। (पीएस मैं पैरामीटरयुक्त प्रश्नों का उपयोग कर रहा हूं चिंता न करें)

मैं सिर्फ इतना उत्सुक हूं कि आप इसे कैसे संभालेंगे, शायद यह समान वीडियो शीर्षक शामिल करना बेहतर होगा?

यहाँ है कि मेरे डेटाबेस तालिकाओं सेटअप कर रहे हैं:

VIDEOS TABLE 
------------ 
video_id [PK,auto_increment] int(11) 
video_name varchar(255) 

TAGS TABLE 
---------- 
tag_id [PK,auto_increment] int(11) 
tag_name varchar(255) 

VIDEOTAGS TABLE 
--------------- 
tag_id [PK,FK] int(11) 
video_id [PK,FK] int(11) 

स्पष्ट रूप से वीडियो तालिका में अधिक कॉलम नहीं है, लेकिन यह सिर्फ दोनों पक्षों

पर स्वत: incrementing प्राथमिक कुंजी के साथ सरल कई-से-अनेक संबंध दिखाता है

साइट MySQL डेटाबेस के साथ पीएचपी पर बनाया गया है, लेकिन वास्तव में कोई फर्क नहीं पड़ता :)

संपादित करें: तो एक जैविक मार्ग नीचे जा रहा से कुछ बात मैं समझ हुई है मैं अपनी अन्य दो टेबल पोस्ट करूंगा जो सेमी-संबंधित हैं जो वीडियो दृश्यों और वीडियो रेटिंग के साथ हैं। अब ध्यान दें मैं गोपनीयता के मुद्दों की वजह से वीडियो दृश्यों मेज पर विशेष रूप से अधिक स्तंभों को जोड़ने का कोई इरादा नहीं है (हाँ मैं जानता हूँ कि मैं रेटिंग तालिका में आईपी स्टोर)

VIDEOVIEWS TABLE 
---------------- 
video_id [FK] int(11) 
view_time datetime 

VIDEORATINGS TABLE 
------------------ 
video_id [PK,FK] int(11) 
ip_address [PK] varchar(15) 
rating int(1) 
rate_time datetime 
+0

हा, धन्यवाद मैं इतना भी सोचा^-^ –

उत्तर

4

यह क्वेरी आईडी के वीडियो (v2) को वापस करनी चाहिए जिसमें आपके दिए गए वीडियो (v1) के साथ टैग सामान्य हैं, सामान्य टैग की संख्या के अवरोही क्रम में।

SELECT v2.video_id 
FROM VideoTags AS v1 
    JOIN VideoTags AS v2 
    USING (tag_id) 
WHERE v1.video_id = ? 
    AND v1.video_id <> v2.video_id 
GROUP BY v2.video_id 
ORDER BY COUNT(*) DESC; 
+0

आप एक LIMIT 5 भी जोड़ सकते हैं (उदाहरण के लिए संबंधित वीडियो की संख्या को 5 तक सीमित करने के लिए) और प्रत्येक पंक्ति को यादृच्छिक वीडियो प्राप्त करने के लिए ORDER से COUNT (*) DESC, RAND() को अंतिम पंक्ति में बदलने के लिए प्रत्येक बार एक ही स्कोर प्राप्त करें । – lpfavreau

+0

यह सबसे अच्छा जवाब दिया गया क्योंकि यह काम पूरा हो गया, कुछ अन्य राय प्राप्त करने की उम्मीद कर रहा था लेकिन whatevz :) –

1

बहुत दिलचस्प सवाल है।

यह सिर्फ ज़ोर से सोच रही है, लेकिन कुछ विकल्प के बारे में सोच सकते हैं:

1) सभी टैग का प्रयोग करें - उदाहरण के लिए वीडियो प्रत्येक टैग कि इस वीडियो करता है की सूची के लिए प्रश्नों की कल्पना। उन सूचियों की संख्या की गणना की गणना की गई वीडियो की एक सूची तैयार करें, यानी इस वीडियो के साथ उनके कितने टैग आम हैं। आम तौर पर अधिक टैग वाले लोग संभावित रूप से 'अधिक संबंधित' होते हैं।

(मैं आपको वास्तविकता में कई प्रश्न पूछने का सुझाव नहीं दे रहा हूं, बस मुझे जो कुछ भी है, उसे समझाने की कोशिश कर रहा हूं ... मेरे से बेहतर SQL-fu वाला कोई व्यक्ति संभवतः एक प्रश्न के साथ आ सकता है जो ऐसा करता है। शायद आप अतिरिक्त रूप से लोकप्रियता या अन्य जानकारी के अनुसार आदेश दे सकते हैं)।

2) एक एल्गोरिदम के साथ आने का प्रयास करें जो संबंधित वीडियो स्वाभाविक रूप से उभरने देता है, एक ला अमेज़ॅन 'जो लोग इसे खरीदा है, वह भी इसे खरीदा है।' उदाहरण के लिए यदि आप ट्रैक करते हैं कि किसने देखा, तो आप ऐसी क्वेरी तैयार करने में सक्षम हो सकते हैं जो ऐसी सूची तैयार करता हो।

+0

आइडिया एक मूल रूप से है कि मैं क्या सोच रहा था, लेकिन मुझे पता नहीं कैसे है कि SQL में अनुवाद कर दिया है। जैसे ही आप इसे डालते हैं, मेरा SQL-fu पर्याप्त मजबूत नहीं है –

+0

अच्छा, यह पूछने के लिए एक अच्छी जगह है ... शायद उस विशिष्ट क्वेरी पर विचारों को अलग SQL प्रश्न के रूप में पूछें, और इसे लिंक करें?लेकिन मुझे लगता है कि यह सवाल भी रखना उचित है, यह एक अच्छा है। – frankodwyer

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