2008-12-20 10 views
9

Więc biegnę małych witryn wideo i na rzeczywistej stronie filmu znajduje się listwa z „podobnych filmów” podobny do większości stron wideo (np YouTube) i obecnie wszystko, co robię, polega na losowym wybraniu jednego z tagów i znalezieniu innych filmów z tym samym tagiem. Nic dziwnego, że nie jest to świetna metoda, ponieważ niektóre tagi są bardzo niejasne, a niektóre filmy są źle oznakowane.Szukasz porad na „Podobne filmy” zapytania o znakowanym systemu wideo

Przykład bieżącego zapytania:

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 

gdzie X oznacza dowolny jeden znaczników z bieżącego obrazu i Y oznacza identyfikator z aktualnego obrazu. (PS: Używam sparametryzowanych kwerend nie martw)

Jestem tylko ciekaw, jak wszyscy by sobie z tym poradzić, może lepiej byłoby włączenie podobnych tytułów wideo?

Oto jak moje tabele bazy danych są ustawione:

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) 

Jest oczywiście więcej kolumn w tabeli filmów, ale to właśnie ilustruje prosty wiele-do-wielu relacji z kluczy podstawowych autoinkrementacja po obu stronach

strona jest zbudowana na PHP z bazą danych MySQL, ale to naprawdę nie ma znaczenia :)

EDIT: Nastąpiła jakaś rozmowa iść w dół trasą organiczny więc postać Opublikuję pozostałe dwie tabele, które są częściowo powiązane z widokami filmów i ocenami filmów wideo. Teraz pamiętać, że nie ma żadnego zamiaru dodając więcej kolumn specjalnie do stołu wyświetleń filmu z powodu kwestii prywatności (tak wiem przechowywania adresów IP w tabeli znamionowej)

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, dzięki tak myślałem^-^ –

Odpowiedz

4

To zapytanie należy zwrócić identyfikatorów filmów (V2), które mają wspólne tagi z danego filmu (V1), w kolejności liczby znaczników w common malejącym.

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

Można również dodać LIMIT 5 (aby ograniczyć liczbę powiązanych filmów do 5 na przykład) i zmienić ostatni wiersz na ORDER BY COUNT (*) DESC, RAND(), aby uzyskać losowe filmy za każdym razem, gdy mają ten sam wynik . – lpfavreau

+0

Dałem tę najlepszą odpowiedź, gdy wykonano zadanie, miałem nadzieję uzyskać kilka innych opinii, ale whatevz :) –

1

bardzo ciekawe pytanie.

To jest po prostu głośno myślę, ale niektóre opcje mogę myśleć to:

1) Użyj wszystkie znaczniki - na przykład wyobrazić zapytań do listy filmów, które każdy znak, że ten film ma. Produkować listę filmów zamówionych przez obliczenie liczby tych listach pojawiają się one, to znaczy rachubę, ile znaczniki mają wspólnego z tym filmem. Te z większą liczbą tagów są prawdopodobnie "bardziej powiązane".

(Nie sugeruję, że robisz wiele zapytań w rzeczywistości, tylko próbujesz wyjaśnić, co mam na myśli ... ktoś z lepszym SQL-fu niż ja może prawdopodobnie wymyślić jedno zapytanie, które to robi. możesz dodatkowo zamówić według popularności lub innych informacji, które możesz mieć).

2) Postaraj się przyjść z algorytmu, który pozwala podobnych filmów pojawiają się naturalnie, a la amazon „ludzi, którzy kupili ten kupił to również”. Na przykład, jeśli śledzisz, kto przeglądał co, możesz zaprojektować zapytanie, które tworzy taką listę.

+0

Idea jeden jest w zasadzie to, co myślałem, ale nie mam pojęcia jak zrobić to przełożyć na SQL. Jak to ujął mój SQL-fu nie jest wystarczająco silny –

+0

Cóż, to jest to dobre miejsce do zadawania ... może poprosić o pomysły na tego konkretnego zapytania jako oddzielny pytanie SQL i połączyć go z tym?Ale myślę, że warto zatrzymać to pytanie, to jest dobre. – frankodwyer

Powiązane problemy