这是交易。
想象表:
type|filter1|filter2|filter3|filter4|filter5
3 |1 |0 |1 |1 |0
...
type - 值的值:1或2或3; 过滤器1 - 5 - 布尔值;
我需要的排序(从上到下依次):
所以在结果的顶部是符合条件号1的行, 然后是2号等等。
希望能够清楚地解释这个问题。
感谢。
P.S。目前的工作解决方案是拥有一堆IF。 ...
SELECT
IF(@type = 3 and @filter1 = 1, 16
,IF(@type=2 and @filter1 = 1, 15
...
)) AS wieght, t.*
FROM table t
ORDER BY weight DESC
但这似乎在为优化而哭泣
答案 0 :(得分:0)
select concat(filter1, filter2, filter3, filter4, filter5) as mysort,t.*
from t
order by mysort, type desc
如果mysql的concat运算符没有将bool自动转换为0/1的字符串,则需要使用内部表达式转换它们。
我最初错过了你在(3,2)类型的排序条件。你可以使用类似于原始方法的二级排序,但由于它只涉及类型字段,因此它应该不那么复杂。
答案 1 :(得分:0)
一个想法可能只是在表上设置一个触发器,设置一个可以编入索引并用于排序的权重字段。然后ORDER BY将非常有效,并且加权的丑陋将被隐藏在独立于任何SELECT语句的触发器中。这样做的缺点是如果表格经常更新,那么触发它可能会减慢速度。
答案 2 :(得分:0)
@Elroy Flynn
不确定此查询应如何工作。 这就是我得到的:
select concat(filter1, filter2, filter3, filter4, filter5) as mysort,
t.type, t.filter1, t.filter2, t.filter3, t.filter4, t.filter5
from complex_sort t
order by mysort, type desc
mysort|type|filter1|filter2|filter3|filter4|filter5
00110|1|0|0|1|1|0
00110|1|0|0|1|1|0
01000|3|0|1|0|0|0
01000|2|0|1|0|0|0
01000|2|0|1|0|0|0
01000|1|0|1|0|0|0
01001|2|0|1|0|0|1
01001|2|0|1|0|0|1
01001|1|0|1|0|0|1
01010|3|0|1|0|1|0
01110|3|0|1|1|1|0
01111|3|0|1|1|1|1
10000|3|1|0|0|0|0
10000|3|1|0|0|0|0
10000|2|1|0|0|0|0
10001|3|1|0|0|0|1
10010|2|1|0|0|1|0
10100|1|1|0|1|0|0
10110|1|1|0|1|1|0
11000|2|1|1|0|0|0