我有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
,每个人都有几个条件。
考虑到只有正确条件的数量很重要并且没有其他优先权的事实,是否有更好的解决方案?
答案 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;