按正确条件的数量排序

时间:2015-11-06 10:43:52

标签: mysql sql sql-order-by

我有16个条件。我希望order by的数字为TRUE。这意味着具有16 TRUE条件的记录高于具有15 TRUE条件的记录。 如果我做以下事情:

select * from tbluser
order by case 
when field1 like 'abc' AND field2 like 'aaa' AND ... field16 like 'bbb' then 1
when field1 like 'abc' AND field2 like 'aaa' AND ... field15 like 'ccc' then 2
.
.
.
when field2 like 'aaa' then 255
when field1 like 'abc' then 256

如你所见,我应该写256 when,每个人都有几个条件。

考虑到只有正确条件的数量很重要并且没有其他优先权的事实,是否有更好的解决方案?

2 个答案:

答案 0 :(得分:0)

你的问题不是很清楚,但听起来你只想在一个受到侵扰的领域订购......所以这是一个这样做的简单例子......

创建表#tmp(f1 int,f2位) INSERT INTO #tmp SELECT 1,1 INSERT INTO #tmp SELECT 1,1 INSERT INTO #tmp SELECT 1,1 INSERT INTO #tmp SELECT 2,1 INSERT INTO #tmp SELECT 2,1 INSERT INTO #tmp SELECT 3,1 INSERT INTO #tmp SELECT 4,1 INSERT INTO #tmp SELECT 4,1

SELECT f1,count(f2) 来自#tmp WHERE f2 = 1 --TRUE GROUP BY f1 ORDER BY 2 DESC,1

如果计数相等,你必须决定规则。

答案 1 :(得分:0)

对于ANSI SQL解决方案,您可以只分配一个真正的谓词1和false 0,并将条件相加,然后按此顺序排序:

ORDER BY 
        CASE WHEN Field1 LIKE 'abc' THEN 1 ELSE 0 END +
        CASE WHEN Field2 LIKE 'aaa' THEN 1 ELSE 0 END +
        ...
        CASE WHEN Field16 LIKE 'bbb' THEN 1 ELSE 0 END DESC;

由于它是MySQL,你可以采取一个轻微的快捷方式,因为它允许添加布尔值:

ORDER BY (Field1 LIKE 'abc') + (Field2 LIKE 'aaa') ... + (Field16 LIKE 'bbb') DESC;