复合分选

时间:2013-03-21 20:47:00

标签: mysql sorting

快速研究,似乎不是解决我问题的好办法。

这是交易。

想象表:

type|filter1|filter2|filter3|filter4|filter5
3   |1      |0      |1      |1      |0
...

type - 值的值:1或2或3; 过滤器1 - 5 - 布尔值;

我需要的排序(从上到下依次):

  1. type = 3,filter1 = 1;
  2. type = 2,filter1 = 1;
  3. type = 1,filter1 = 1;
  4. type = 3,filter2 = 1;
  5. type = 2,filter2 = 1;
  6. type = 1,filter2 = 1;
  7. type = 2,filter3 = 1且filter4 = 1;
  8. type = 3,filter3 = 1且filter4 = 1;
  9. type = 1,filter3 = 1且filter4 = 1;
  10. type = 2,filter3 = 1且filter5 = 1;
  11. type = 3,filter3 = 1且filter5 = 1;
  12. type = 1,filter3 = 1且filter5 = 1;
  13. 输入(3,2),filter4 = 1;
  14. type = 1,filter4 = 1;
  15. 输入(3,2),filter5 = 1;
  16. type = 1,filter5 = 1;
  17. 所以在结果的顶部是符合条件号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
    

    但这似乎在为优化而哭泣

3 个答案:

答案 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