我目前正在编写一个基于回答问题匹配用户的web应用程序。我已经在一个查询中实现了我的匹配算法,并将其调整到目前为止,计算两个用户之间的匹配百分比需要8.2ms。但是,我的web应用程序必须获取用户列表并遍历执行此查询的列表。对于5000个用户,我的本地计算机花费了50秒。是否有可能将所有内容都放入一个查询中,该查询返回一个包含user_id和一列的计算匹配的列?或者是一个存储过程的一个选项?SQL:返回用户表与计算列的匹配百分比?
我目前正在使用MySQL,但愿意切换数据库,如果需要的话。
任何有兴趣的架构和数据,我创建了一个SQLFiddle:http://sqlfiddle.com/#!2/84233/1
和我匹配的查询:
SELECT COALESCE(SQRT((100.0*as1.actual_score/ps1.possible_score) * (100.0*as2.actual_score/ps2.possible_score)) - (100/ps1.commonquestions), 0) AS perc
FROM (SELECT SUM(imp.value) AS actual_score
FROM user_questions AS uq1
INNER JOIN importances imp ON imp.id = uq1.importance
INNER JOIN user_questions uq2 ON uq2.question_id = uq1.question_id AND uq2.user_id = 101
AND (uq1.accans1 = uq2.answer_id
OR uq1.accans2 = uq2.answer_id
OR uq1.accans3 = uq2.answer_id
OR uq1.accans4 = uq2.answer_id)
WHERE uq1.user_id = 1) AS as1,
(SELECT SUM(value) AS possible_score, COUNT(*) AS commonquestions
FROM user_questions AS uq1
INNER JOIN importances ON importances.id = uq1.importance
INNER JOIN user_questions uq2 ON uq1.question_id = uq2.question_id AND uq2.user_id = 101
WHERE uq1.user_id = 1) AS ps1,
(SELECT SUM(imp.value) AS actual_score
FROM user_questions AS uq1
INNER JOIN importances imp ON imp.id = uq1.importance
INNER JOIN user_questions uq2 ON uq2.question_id = uq1.question_id AND uq2.user_id = 1
AND (uq1.accans1 = uq2.answer_id
OR uq1.accans2 = uq2.answer_id
OR uq1.accans3 = uq2.answer_id
OR uq1.accans4 = uq2.answer_id)
WHERE uq1.user_id = 101) AS as2,
(SELECT SUM(value) AS possible_score
FROM user_questions AS uq1
INNER JOIN importances ON importances.id = uq1.importance
INNER JOIN user_questions uq2 ON uq1.question_id = uq2.question_id AND uq2.user_id = 1
WHERE uq1.user_id = 101) AS ps2
您可以结合查询的两个“腿”的“常见问题”子表达式。你也可以将用户= 1和用户= 101的子查询概括为一个广义的CTE查询(如果你的数据库管理系统支持它们),但首先:请向我们展示表格定义和可能的一些数据。 – wildplasser
是的,数据与各自所需的输出 –
我创建了一个SQLFiddle来玩:)当我匹配用户1和5时,结果应该是'43.678'http://sqlfiddle.com/#!2/84233/1 – Mexxer