Bir "ilgili videolar" tavsiye arıyor

2 Cevap php

Peki ben küçük bir video sitesi çalıştırmak ve gerçek video sayfasında en video yüzüne benzer "ilgili videolar" (örneğin YouTube) ve şu anda ben yapıyorum tüm rastgele onun etiketleri birini alarak ve diğer videolar bulgudur bir şerit var aynı etiket. Bazı sözcükler çok belirsiz ve bazı videoları mis-etiketli olarak değil, şaşırtıcı bu büyük bir yöntem değildir.

Geçerli sorgu örneği:

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

X geçerli video etiketleri herhangi biridir ve y geçerli videodan kimliği olduğu. (Ben parametreli sorgular istimal PS merak etmeyin)

Ben bütün bunları nasıl ele olarak, belki de benzer bir video başlıkları birleştirmek için daha iyi olurdu merak ediyorum?

İşte benim veritabanı tabloları kurulum nasıl olduğunu:

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)

Orada daha fazla sütun videoları tabloda açıkça ama bu sadece her iki tarafta otomatik artan birincil tuşları ile basit çok-çok ilişkisi göstermektedir

Site bir MySQL veritabanı ile PHP üzerine inşa edilmiştir, ama bu gerçekten önemli değil :)

EDIT: bu yüzden ben video izleme ve video puan ile ilgisi olan yarı-ilişkili olan benim diğer iki tablo yayınlamak istiyorum anlamaya organik bir rota aşağı gidiyor bazı konuşmalar oldu. Şimdi ben (evet ben değerlendirme tablosunda IP'leri depolamak biliyoruz) çünkü gizlilik sorunları özellikle video bakıldı tabloya daha fazla sütun ekleyerek herhangi bir niyeti yok unutmayın

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

2 Cevap

Bu sorgu ortak etiketlerin sayısı azalan, sizin verilen video (v1) ile ortak etiketler videolar (v2) ve id dönmelidir.

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;

Çok ilginç bir soru.

Bu sadece yüksek sesle düşünüyorum, ama aklıma bazı seçenekler şunlardır:

1) Tüm etiketleri kullanın - örneğin bu video does her etiketine sahip videoların listesi için sorgular düşünün. Onlar görünen bu listelerin sayısı sayımı tarafından sipariş videoların bir listesini üretmek bu video ile ortak kaç etiketler deyince yani. Ortak daha etiketleriyle olanlar muhtemelen 'fazla ilgili' vardır.

(Ben sadece aklınızda ne anlatmaya çalışıyor, gerçekte birden sorguları yapmak demiyorum ... benden daha iyi SQL-fu ile birileri muhtemelen. Bunu yapan tek bir sorgu ile gelebilir Belki olabilir ayrıca sipariş popülerlik veya olabilecek diğer bilgilere göre).

2) ilgili videolar doğal olarak ortaya sağlayan bir algoritma, a la amazon 'Bu da bu aldılar insanlarla' ile gelmek deneyin. Ne izlendi kim izlemek Örneğin, böyle bir liste üreten bir sorgu tasarlamak mümkün olabilir.