免责声明:我对MySQL很陌生,将此作为实验来了解更多信息。
基本上,我有一个表,其中一行是'主'行。我想将这一行与少数其他行进行比较。从这一点开始,我想选择一个与主行最“正确”或类似的那个并将其存储到变量中。如果少数行中没有一行与主设备相似,我只想取消操作。
我可以想办法用迭代来做到这一点,但我一直在阅读迭代是非常低效/使用SQL的不良做法,并想看看是否有另一种方式。
通过这个例子,我想选择提交2,并拒绝提交1和3.
Type, Answer 1, Answer 2, Answer 3
Master, 100, 200, 300
Submission 1, 100, 400, 300
Submission 2 , 100, 500, 500
Submission 3, 200, 100, 300
但是,在下面的示例中,我想要选择提交1,尽管两者不完全相同。
Type, Answer 1, Answer 2, Answer 3
Master, 100, 200, 300
Submission 1, 100, 400, 300
Submission 2 , 100, 500, 500
Submission 3, 500, 200, 300
最后,在这里我要选择提交1,因为它发生在提交3之前,尽管两者的正确程度相同。
.NET Core 1.0
答案 0 :(得分:1)
尝试以下查询。它计算Master
行与其他行共有的答案数。并且在按正确答案数量排列的情况下,它使用每个错误答案的数字差异来选择最接近的答案。
SELECT t.Type, t.Answer1, t.Answer2, t.Answer3,
(t.a1 + t.a2 + t.a3) AS numRight,
(t.d1 + t.d2 + t.d3) AS numOff
FROM
(
SELECT t2.Type, t2.Answer1, t2.Answer2, t2.Answer3,
CASE WHEN t1.Answer1 = t2.Answer1 THEN 1 ELSE 0 END AS a1,
CASE WHEN t1.Answer2 = t2.Answer2 THEN 1 ELSE 0 END AS a2,
CASE WHEN t1.Answer3 = t2.Answer3 THEN 1 ELSE 0 END AS a3,
ABS(t1.Answer1 - t2.Answer1) ASd1,
ABS(t1.Answer2 - t2.Answer2) AS d2,
ABS(t1.Answer3 - t2.Answer3) AS d3
FROM yourTable t1 INNER JOIN yourTable t2
ON t1.Type = 'Master' AND t2.Type <> 'Master'
) t
ORDER BY numRight DESC, numOff
如果您只想要一行,可以在查询末尾添加LIMIT 1
。
在这里演示: