PDA

Pogčedajte punu verziju : Tags - related entries problem


robi-bobi
13. 04. 2007., 23:37
Imam entries i za njih vezane tagove

Related entries mi trenutno pokazuje 5 entrija koji imaju bar jedan zajednicki tag sa trenutnim, poredjani po id DESC

E sad, ono sto bih ja hteo je da imam 5 naj-relevatnijih entrija. T.j. ako imam 5 tagova, i imam jos 2 entrija koji imaju zajednicki 1 tag sa trenutnim, a takodje imam i 1 entry koji ima 2 zajednicka taga - onda zelim da mi kao No1 pokaze upravo ovaj drugi

Jel postoji neka slozenija SQL zavrzlama koja ce ovo malo brze da sredi od moje pesacke ideje:
uraditi neki cron, koji ce za svaki unos pretrazivati ostale unose za zajednicke tagove, a zatim iste poredjati po broju zajednickih. Rezultat negde kesirati. Sutra idemo opet cron...

noviKorisnik
14. 04. 2007., 01:19
Sigurno postoji to fino obrađeno teoretski i praktično na netu, no mene mrzi sada da tražim pa ću samo malo da pametujem :-)

Ako dobro razumem - to su ti (bar) dve tabele - jedna za entries i druga s tagovima i idovima entrija kojima odgovaraju tagovi.

Ako tražiš skup relevantnih entrija, prvo posmatraš skup tagova trenutnog entrija.

select identry, count(*) from tags where tag in (select tag from tags where identry = trenutni) and identry != trenutni group by identry order by count(*) desc limit 5

(ok, ovo je na nivou ideje, molio bih da me ispravi neko ako ima neka brljotina jer se već poduže nisam ozbiljnije igrao sql-a :-)

Petar Marić
14. 04. 2007., 02:32
Dobio sam ideju kako bi se moglo napisati nešto slično što je zamislio nK a bez upotrebe pod-upita:
# DDL
CREATE TABLE `entry_tags` (
`entry_id` int(11) NOT NULL,
`tag_id` int(11) NOT NULL,
PRIMARY KEY (`entry_id`,`tag_id`)
);

# Upit
SELECT b.entry_id, COUNT(*) as score FROM entry_tags a
JOIN entry_tags b ON
a.tag_id = b.tag_id AND
a.entry_id = 1 # entry_id za koji trazimo slicne unose
GROUP BY b.entry_id
HAVING b.entry_id != 1 # entry_id za koji trazimo slicne unose
ORDER BY COUNT(*) DESC;

Velika mana ovog rešenja je to što u obzir uzima samo presek skupova ali ne i njihovu razliku.
Bolje rešenje bi bilo tipa +2 "glasa" za svaki tag koji se nalazi u oba unosa (referentni i onaj koji se trenutno poredi s njim) i -1 "glas" za svaki tag koji se ne nalazi u nekom od ta 2 unosa - i na kraju se rezultati sortiraju po sumi.