我的任务是与我当地的社区中心一起在情人节及时制作一个“新婚”类型的游戏,所以不要着急!
所以,我们有 50 对非常了解彼此的夫妇将提前被问到 100 个问题。每个问题都有用户的回答和允许误差范围的范围(此范围配额将受到限制)。然后他们可以选择他们认为合作伙伴的答案,误差范围相同。
EG(我会像我和我的GF一样打一轮):
问:你喜欢吃水果吗?我对水果很挑剔,所以我会在 100 分中打出低分……比如 20 'LL允许将是30岁。我认为她喜欢水果,至少会放90个..但是她喜欢很多食物,所以可以将其排名较低,所以我给她20的利润率为20。
好的,对 100 个问题和 50 对重复该过程。
我剩下一张这样的桌子:
u_a = 用户回答
u_l = 用户误差水平
p_a = 合作伙伴答案
p_l = 合作伙伴误差水平
CREATE TABLE IF NOT EXISTS `large` (
`id_user` int(11) NOT NULL,
`id_q` int(11) NOT NULL,
`u_a` int(11) NOT NULL,
`u_l` int(11) NOT NULL,
`p_a` int(11) NOT NULL,
`p_l` int(11) NOT NULL,
KEY `id_user` (`id_user`,`id_q`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Stackoverflow Test';
所以我的行将在前面的示例中:
(1, 1, 20, 30, 90, 20)
我的任务是搜索所有用户,看看谁是 50 人中最匹配的人。(并希望夫妻相处得很好!)。
我想在数据库中搜索我对合作伙伴的答案与他们的答案相匹配的所有用户,但对于每个用户。
这是我到目前为止所得到的(注意我已经注释掉了一些代码,那是因为我正在尝试两种方法,不确定什么是最好的):
SELECT
match.id_user,
count(*) as count
from `large` `match`
INNER JOIN `large` `me` ON me.id_q = match.id_q
WHERE
me.id_user = 1 AND
match.id_user != 1 AND
GREATEST(abs(me.p_a - match.u_a), 0) <= me.p_l
AND
GREATEST(abs(match.p_a - me.u_a), 0) <= match.p_l
#match.u_a BETWEEN GREATEST(me.p_a - me.p_l, 0) AND (me.p_a + me.p_l)
#AND
#me.u_a BETWEEN GREATEST(match.p_a - match.p_l, 0) AND (match.p_a + match.p_l)
GROUP BY match.id_user
ORDER BY count DESC
我今天的问题是:
此查询需要 AGES!我想在游戏期间这样做,让用户有机会在晚上更改答案并获得即时结果,所以这必须很快。为我(用户 1)查找所有匹配项时,我正在查看 40 秒。
我现在正在阅读有关数据库引擎和索引的信息,以确保我正在尽我所能......但欢迎提出建议!
干杯和呸!