Autor Zpráva
matak
Profil
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
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?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0