我需要一个查询,根据用户关注的电视节目为用户找到推荐的电视节目。为此,我有以下表格:
Progress
包含用户正在关注的节目的表和看过的剧集的百分比(为了解决这个问题,我们可以假设我在数据库中只有一个用户)Suggested
包含_id1
,_id2
和的表value
(值是 id=_id1
的节目和id= 的节目之间的联系强度_id2
:value
越多越好,节目的共同点越多)。请注意,在此表中应用了交换性质,因此 和 之间的连接强度与id1
和_id2
相同。此外,没有两行,例如 ROW1._id1=ROW2._id2 AND ROW1._id2 = ROW2._id1_id1
_id2
包含有关电视节目的详细信息的表
ShowCache
,例如名称等。
以下查询是我想要做的,但结果是一个空集:
SET @a = 0; //In other tests this line seem to be necessary
SELECT `ShowCache`.*,
(SUM(value) * (Progress.progress)) as priority
FROM `Suggested`,`ShowCache`, Progress
WHERE
((_id2 = Progress.id AND _id1 NOT IN (SELECT id FROM Progress) AND @a:=_id1)//There is a best way to set a variable here?
OR
(_id1 = Progress.id AND _id2 NOT IN (SELECT id FROM Progress) AND @a:=_id2))
AND `ShowCache`._id = @a //I think that the query fails here
GROUP BY `ShowCache`._id
ORDER BY priority DESC
LIMIT 0,20
我知道问题与变量的使用有关,但我无法解决。非常感谢任何帮助。
PS:主要问题是(由于可交换性),没有变量我需要两个查询,开始执行大约需要 3 秒(查询比上面的更复杂)。我真的在尝试做一个查询来完成这项任务
PPS:我还绑定了 XOR 操作,导致无限循环?!?!?这是我尝试过的 WHERE 子句:
((_id2=Progress.id AND @a:=_id1) XOR (_id1=Progress.id AND @a:=_id2)) AND `ShowCache`._id = @a
编辑:我在不使用任何变量的情况下提出了这个 WHERE 条件:
(_id2 = Progress.id OR _id1 = Progress.id)
AND `ShowCache`._id = IF(_id2 = Progress.id, _id1,_id2)
AND `ShowCache`._id NOT IN (SELECT id FROM Progress)
它可以工作,但速度很慢。