这里有一个复杂的SQL问题。
我目前有一个SELECT语句,它匹配多个字段,如下所示。
SELECT field1, field2, field3, field4, field5
FROM table
WHERE field1 = 'variable 1'
AND field2 = 'variable 2'
AND field3 = 'variable 3'
AND field4 = 'variable 4'
AND field5 = 'variable 5'
我想修改语句,使其使用OR代替AND,以便选择与任何字段匹配的所有记录。
下一步是使用评分系统对结果进行排名。
If field 1 was matched then 1000 is added to the score
If field 2 was matched then 800 is added to the score
If field 3 was matched then 600 is added to the score
If field 4 was matched then 10 is added to the score
If field 5 was matched then 1 is added to the score
因此...
匹配1 - 如果field2和field 3匹配则分数为1400
匹配2 - 如果field1和field 4匹配则分数为1010
匹配1将位于结果的顶部。
任何帮助实现这一目标的SQL都会受到赞赏。
答案 0 :(得分:5)
TRY:
SELECT
....
FROM ....
ORDER BY
(CASE WHEN field1 = 'variable 1' THEN 1000 ELSE 0 END
+CASE WHEN field2 = 'variable 2' THEN 800 ELSE 0 END
+CASE WHEN field3 = 'variable 3' THEN 600 ELSE 0 END
+CASE WHEN field4 = 'variable 4' THEN 10 ELSE 0 END
+CASE WHEN field5 = 'variable 5' THEN 1 ELSE 0 END
) DESC
答案 1 :(得分:3)
如果你需要在一个Select中做到这一点,那么它必须是一个可怕的东西:
SELECT field1, field2, field3, field4, field5
FROM table
WHERE field1 = 'variable 1'
OR field2 = 'variable 2'
OR field3 = 'variable 3'
OR field4 = 'variable 4'
OR field5 = 'variable 5'
ORDER BY (Case when field1 = 'variable 1' then 1000 else 0 end
+ Case when field2 = 'variable 2' then 800 else 0 end
+ Case when field3 = 'variable 3' then 600 else 0 end
+ Case when field4 = 'variable 4' then 10 else 0 end
+ Case when field5 = 'variable 5' then 1 else 0 end) DESC
编辑:如果要输出分数,还可以将多个案例部分作为输出字段放入SELECT中。然后,您可以通过引用其别名或其列索引(如Yannick M.在下面所做的那样)来订购
一个稍微好一点的解决方案可能是将其分解为多个查询,第一个将基本数据选择到临时表中,然后后续查询扫描临时表以调整分数值。但根据您的环境,这可能不是一种选择。
答案 2 :(得分:2)
使用CASE表达式创建分数:
CASE WHEN field1 = 'variable 1' THEN 1000 ELSE 0 END +
CASE WHEN field2 = 'variable 2' THEN 800 ELSE 0 END +
...
AS score
然后你可以按分数排序(看看它,如果那是相关的)。或者,只需复杂表达式ORDER BY,就像在其他答案中一样。
答案 3 :(得分:2)
这个怎么样:
SELECT field1, field2, field3, field4, field5
FROM table
WHERE field1 = 'variable 1'
OR field2 = 'variable 2'
OR field3 = 'variable 3'
OR field4 = 'variable 4'
OR field5 = 'variable 5'
ORDER BY
CASE WHEN field1 = 'variable 1' THEN 1000 ELSE 0 END +
CASE WHEN field2 = 'variable 2' THEN 800 ELSE 0 END +
CASE WHEN field3 = 'variable 3' THEN 600 ELSE 0 END +
CASE WHEN field4 = 'variable 4' THEN 10 ELSE 0 END +
CASE WHEN field5 = 'variable 5' THEN 1 ELSE 0 END
DESC
答案 4 :(得分:1)
SELECT field1, field2, field3, field4, field5,
(CASE WHEN field1 = 'variable 1' THEN 1000 ELSE 0 END +
CASE WHEN field2 = 'variable 2' THEN 800 ELSE 0 END +
CASE WHEN field3 = 'variable 3' THEN 600 ELSE 0 END +
CASE WHEN field4 = 'variable 4' THEN 10 ELSE 0 END +
CASE WHEN field5 = 'variable 5' THEN 1 ELSE 0 END) as score
FROM table
ORDER BY 6 DESC;
+------+------+------+------+------+-------+
| f1 | f2 | f3 | f4 | f5 | score |
+------+------+------+------+------+-------+
| 1 | 2 | NULL | NULL | NULL | 1800 |
| NULL | 2 | NULL | NULL | NULL | 800 |
| NULL | NULL | 3 | NULL | 5 | 601 |
+------+------+------+------+------+-------+
3 rows in set (0.00 sec)
答案 5 :(得分:0)
在我看来,最好的方法是在一个聚合查询中 - 如果它能回答你的问题。代码看起来像这样:
SELECT
SUM(CASE WHEN FIELD1 = 'VARIABLE 1' THEN 1000 ELSE 0 END) F1FIND
, SUM(CASE WHEN FIELD2 = 'VARIABLE 2' THEN 800 ELSE 0 END) F2FIND
, SUM(CASE WHEN FIELD3 = 'VARIABLE 3' THEN 600 ELSE 0 END) F3FIND
, SUM(CASE WHEN FIELD4 = 'VARIABLE 4' THEN 10 ELSE 0 END) F4FIND
, SUM(CASE WHEN FIELD5 = 'VARIABLE 5' THEN 1 ELSE 0 END) F5FIND
FROM
TABLE
;
如果你只是想为特定因子返回一个分数,你可以这样子查询:
SELECT
F1FIND+F2FIND+F3FIND+F4FIND+F5FIND AS TOTAL_FIND
FROM
([ABOVE QUERY])
WHERE
FACTOR = 'SOMETHING'
;