2013-06-28 45 views
1

不幸的是,我的SQL非常生疏。我现在有一个说法是这样的:在ORDER BY语句中计算CASE

SELECT field1, field2, field3 FROM table_name WHERE 
    field1 = 'A' OR field2 = 'B' OR field3 = 'C' ORDER BY 
     CASE WHEN field1 = 'A' THEN 1 ELSE 0 END + 
     CASE WHEN field2 = 'B' THEN 1 ELSE 0 END + 
     CASE WHEN field3 = 'C' THEN 1 ELSE 0 END 
    DESC LIMIT 1; 

该查询正确查找最相似的项目到field1field2field3分别为ABC的“理想”。但是,我也希望能够找到“匹配”字段的数量。看起来我应该能够很容易地得到它,因为我已经在执行该计算,但是我不确定没有另一个子查询。

任何帮助将不胜感激!

回答

2

修订

SELECT field1, field2, field3, 
     CASE WHEN field1 = 'A' THEN 1 ELSE 0 END + 
     CASE WHEN field2 = 'B' THEN 1 ELSE 0 END + 
     CASE WHEN field3 = 'C' THEN 1 ELSE 0 END match_count 
    FROM table_name 
WHERE field1 = 'A' OR field2 = 'B' OR field3 = 'C' 
ORDER BY match_count DESC 

在这种特殊情况下(的MySql),你可以根据match_count使用替代CASE(fieldX = 'N')

SELECT field1, field2, field3, 
     (field1 = 'A') + (field2 = 'B') + (field3 = 'C') match_count 
    FROM table_name 
WHERE field1 = 'A' OR field2 = 'B' OR field3 = 'C' 
ORDER BY match_count DESC 

我们限制结果集HAVING条款

SELECT field1, field2, field3, 
     (field1 = 'A') + (field2 = 'B') + (field3 = 'C') match_count 
    FROM table_name 
WHERE field1 = 'A' OR field2 = 'B' OR field3 = 'C' 
HAVING match_count > 1 
ORDER BY match_count DESC 

这里是SQLFiddle演示上述所有查询

+0

我一直在寻找的正是这样!感谢代码和演示。 – JacobEvelyn

+0

不用等几分钟,我不会让我接受它,对不起。我最初的问题:是否有一种简单的方法可以将查询结果限制为match_count'>某个阈值,而不输出'match_count'? – JacobEvelyn

+0

我想我可以再次执行'CASE'并将它放在'AND'子句中。 – JacobEvelyn