2008-12-20 9 views
9

Beh, eseguo un piccolo sito Web di video e sulla pagina video effettiva c'è una striscia di "video correlati" simile alla maggior parte dei video (es. YouTube) e attualmente tutto ciò che sto facendo è prendere uno dei suoi tag in modo casuale e trovare altri video con lo stesso tag. Non sorprende che questo non sia un ottimo metodo in quanto alcuni tag sono molto vaghi e alcuni video sono etichettati erroneamente.Cercare consigli su una query "video correlati" su un sistema video codificato

Esempio di query corrente:

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 

Dove x è uno qualsiasi dei tag dal video corrente ed y è l'ID del video corrente. (P.S. Sto usando le query parametrizzate non ti preoccupare)

Sono solo curioso di sapere come gestiresti tutto questo, forse sarebbe meglio incorporare titoli video simili?

Ecco come le mie tabelle del database sono installati:

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) 

C'è, ovviamente, più colonne della tabella video, ma questo solo illustra il semplice molti-a-molti con chiavi primarie incremento automatico su entrambi i lati

Il sito è costruito su PHP con un database MySQL, ma che in realtà non importa :)

EDIT: C'è stato un po 'parlare di scendere un percorso organico così ho dato Pubblicherei i miei altri due tavoli che sono semi-correlati che hanno a che fare con visualizzazioni video e valutazioni video. Ora notare non ho alcuna intenzione di aggiungere più colonne specificamente al tavolo video di vista a causa di problemi di privacy (sì lo so devo conservare gli IP nella tabella dei valori nominali)

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

Hah, grazie Lo pensavo anch'io^-^ –

risposta

4

Questa query deve restituire gli ID dei video (v2) che hanno tag in comune con il video specificato (v1), in ordine decrescente del numero di tag in comune.

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

Puoi anche aggiungere un LIMIT 5 (per limitare il numero di video correlati a 5 per esempio) e modificare l'ultima riga in ORDER BY COUNT (*) DESC, RAND() per ottenere video casuali ogni volta che hanno lo stesso punteggio . – lpfavreau

+0

Ha dato la migliore risposta in quanto ha portato a termine il lavoro, speravo di ottenere qualche altra opinione ma whatevz :) –

1

domanda molto interessante.

Questo è solo pensando ad alta voce, ma alcune opzioni mi viene in mente sono:

1) Utilizzare tutti i tag - per esempio immaginare le query per l'elenco dei video che hanno ogni tag che questo video fa. Produci un elenco di video ordinati per il conteggio del numero di tali elenchi su cui appaiono, ovvero il conteggio del numero di tag che hanno in comune con questo video. Quelli con più tag in comune sono presumibilmente "più correlati".

(Non sto suggerendo di fare più query in realtà, solo cercando di spiegare quello che ho in mente ... qualcuno con SQL-fu migliore di me può probabilmente trovare una singola query che faccia questo. puoi inoltre ordinare per popolarità o altre informazioni che potresti avere).

2) Provare a venire con un algoritmo che consente di far emergere naturalmente i relativi video, una persona amazzonica che ha acquistato questo ha acquistato anche questo. Ad esempio, se si tiene traccia di chi ha visualizzato cosa, si può essere in grado di progettare una query che produce tale elenco.

+0

Idea uno è fondamentalmente quello che stavo pensando ma non ho idea di come fare che si traducono in SQL. Come hai detto, il mio SQL-fu non è abbastanza forte –

+0

Bene, questo è un buon posto dove chiedere ... magari chiedere idee su quella specifica query come una domanda SQL separata e collegarla a questa?Ma penso che valga la pena tenere anche questa domanda, è buona. – frankodwyer