Autor | Zpráva | ||
---|---|---|---|
matak Profil |
#1 · Zasláno: 21. 11. 2012, 00:24:03
Nevím jak to napsat lépe, ale představte si, že mám seznam lidí a k nim mám přiřazené nějaké vlastnosti, každá vlastnost spadá do nějaké sekce.
Sekce např. zájmy, preferované jazyky, vzdělání podle škol k tomu patří tabulka lidi ==== id, name další tabulka zajmy ==== id, name jazyky ===== id, name vzdelani ====== id, name a pak párovací tabulky lidi_zajmy ======= idClovek, idZajem 1, 1 1, 2 1, 3 atd. lidi_jazyky ======= idClovek, idJazyk 1, 1 1, 2 atd. lidi_vzdelani ========= idClovek, idVzdelani 1,1 1,2 1,3 atd. jak najít nejlepší shodu mezi těmito lidmi? ti co jsou si nejvíce podobní? |
||
juriad Profil |
nejvnitřnější selecty počítají kolik maj dva různí lidé společných vlastností v dané sekci
ty poté sloučím do jednoho seznamu, který obsahuje shody všech dvojic lidí ze všech sekcí poté se jen sečte celkový součet shod a seřadí podle počtu SELECT l1.name, l2.name, SUM(shoda) shodaSum FROM lidi l1 CROSS JOIN lidi l2, JOIN ( ( SELECT l1.id id1, l2.id id2, COUNT(*) shoda FROM lidi l1 CROSS JOIN lidi l2 JOIN lidi_zajmy z1 ON (l1.id = z1.idClovek) JOIN lidi_zajmy z2 ON (l2.id = z2.idClovek) WHERE l1.id <> l2.id AND z1.idZajem = z2.idZajem GROUP BY l1.id, l2.id ) UNION ALL ( SELECT l1.id id1, l2.id id2, COUNT(*) shoda FROM lidi l1 CROSS JOIN lidi l2 JOIN lidi_jazyky j1 ON (l1.id = j1.idClovek) JOIN lidi_jazyky j2 ON (l2.id = j2.idClovek) WHERE l1.id <> l2.id AND j1.idJazyk = j2.idJazyk GROUP BY l1.id, l2.id ) UNION ALL ( SELECT l1.id id1, l2.id id2, COUNT(*) shoda FROM lidi l1 CROSS JOIN lidi l2 JOIN lidi_vzdelani v1 ON (l1.id = v1.idClovek) JOIN lidi_vzdelani v2 ON (l2.id = v2.idClovek) WHERE l1.id <> l2.id AND v1.idVzdelani = v2.idVzdelani GROUP BY l1.id, l2.id ) ) shody ON (l1.id = shody.id1 AND l2.id = shody.id2) -- WHERE l1.id <> l2.id -- neni nutne GROUP BY l1.id, l2.id ORDER BY shodaSum DESC |
||
matak Profil |
#3 · Zasláno: 21. 11. 2012, 09:20:00
zajimave děkuji a není to extrémně náročné na stroj? je to použitelné při větší návštěvnosti?
|
||
Časová prodleva: 11 let
|
0