Det är lite av problemet att modellen är såpass dålig, men här kommer den.
ID - DESC - CAT - TYPE
1 fotboll sport p
1 hockey sport p
1 matlagning mat s
1 fisk mat s
1 flygning hobby s
5 matlagning mat p
5 fisk mat p
5 fotboll sport s
5 hockey sport s
6 matlagning mat p
6 flygning hobby p
6 rally sport s
6 hockey sport s
Där p är de personliga egenskaperna och s är de egenskaper man vill att motparten skall ha.
Jag har funderat på att generera en bitmask för varje användare, men jag vet inte hur man skall få in grupper i det.
Bitmask exempel:
100010
skulle kunna vara exempel på intressekategorin och då betyda
1 ja han skatar
0 nej han simmar inte
0 nej han kör inte rally
0 nej han cyklar inte
1 ja han klättrar
0 nej han springer inte
Problemet är att jag har flera kategorier. Jag funderade då på om man kunde mata in bitmasken i ett varcharfält och separera varje kategori med en punkt. Men då vet jag inte hur man bygger logiken för att vandra igenom kategori för att få fram både and och or.
Kanske kan man bygga ett eget index av något slag? Prioritering är hastighet, utan i så fall skulle man kunna indexera om en användare när han gör ändringar - vilket borde gå fort.
Såhär är reglerna:
Den som söker en annan person kanske söker efter två alternativ (DESC) i samma kategori (CAT), och då räcker det med en träff.
Exempelvis kan det se ut såhär:
ID - DESC - CAT - TYPE
1 fotboll sport p
1 hockey sport p
1 matlagning mat s
1 fisk mat s
1 flygning hobby s
5 matlagning mat p
5 fisk mat p
5 fotboll sport s
5 hockey sport s
6 matlagning mat p
6 flygning hobby p
6 rally sport s
6 hockey sport s
Om användare 1 söker så kommer ser vi att han söker efter en person som har antingen fisk eller matlagning i kategorin mat OCH flygning som hobby.
Detta gör att han kommer att få träff på användare nummer 6 eftersom den har matlagning och flygning. Notera att användaren inte har fisk, men den är ju i samma kategori som matlagning så alltså är det eller som gäller där.
Det kommer inte att bli träff på användare nummer 5 eftersom han saknar flygning som hobby i sin personliga lista. Vi ser dock att han uppfyller både matlagning och fisk, men eftersom det är i samma kategori hjälper inte det.
Såhär ser min nuvarande kod ut (som inte fungerar)
------------------------------------------------------
SELECT
ID
FROM
dbo.GetLikes(129467)
WHERE
isnull(dbo.Likes(129467, ID),-1) = 3
------------------------------------------------------
ALTER function getLikes(@id int)
returns TABLE
AS RETURN
(
SELECT
t2.ID
FROM
rum_val t1
INNER JOIN rum_val t2 ON
t1.ID <> t2.ID
AND t1.DESC = t2.DESC
AND t1.CAT = t2.CAT
AND t2.TYPE = 'n'
WHERE
t1.ID = @id
and
t1.TYPE = 'd'
GROUP BY
t1.ID, t2.ID
HAVING
(COUNT(*) >= (SELECT COUNT(DISTINCT t3.CAT)
FROM
rum_val t3
WHERE
t3.ID = t1.ID
AND t3.TYPE = 'd'))
)
------------------------------------------------------
ALTER function Likes(@in_id1 int, @in_id2 int)
returns int
AS BEGIN
DECLARE @retval int
DECLARE @id1 int
DECLARE @id2 int
DECLARE @tmptbl TABLE
(
id1 int,
id2 int
)
INSERT INTO
@tmptbl
SELECT
isnull(t1.ID,-1) id1, isnull(t2.ID,-1) id2
FROM
rum_val t1
FULL JOIN rum_val t2 ON
t1.ID <> t2.ID
AND t1.DESC = t2.DESC
AND t1.CAT = t2.CAT
AND t2.TYPE = 'n'
AND t2.ID=@in_id2
WHERE
t1.ID = @in_id1
and
t1.TYPE = 'd'
AND t2.ID=@in_id2
GROUP BY
t1.ID, t2.ID
HAVING
(COUNT(*) >= (SELECT COUNT(DISTINCT t3.CAT)
FROM
rum_val t3
WHERE
t3.ID = t1.ID
AND t3.TYPE = 'd'))
ORDER BY t2.ID
SELECT @id1=id1, @id2=id2 FROM @tmptbl
if (@id1>0 and @id2>0)
SET @retval = 3
if (@id1>0 and @id2=-1)
SET @retval = 2
if (@id1=-1 and @id2>0)
SET @retval = 1
if (@id1=-1 and @id2=-1)
SET @retval = 0
RETURN @retval
END
GO
------------------------------------------------------
Hoppas ni förstår :)