2013-03-21 72 views
0

做了快速研究,似乎没有很好的解决我的问题。复合排序

这里是交易。

想象表:

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

型 - 可能值:1或2或3; 过滤器1 - 5 - 布尔值;

排序我需要(从顶部到底部降序):

  1. 类型= 3,过滤器1 = 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;

所以在结果的顶部将是符合条件编号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

你可以规范化表吗? – Kermit 2013-03-21 20:49:30

+0

@波利斯王子,那只是一个抽象的例子。实际上,类型字段的计算方法是使用FIELD()func,过滤器1到5也不直接存储在该表中。多个(5-7)联接是女仆。 – 2013-03-23 20:57:59

回答

0
select concat(filter1, filter2, filter3, filter4, filter5) as mysort,t.* 
from t 
order by mysort, type desc 

如果MySQL的毗连运算符不自动施放BOOL到0/1弦你需要与他们投一个内在的表达。

我最初错过了(3,2)类型排序的条件。你可以使用类似于原始方法的二级排序,但由于它只涉及类型字段,所以它应该不那么复杂。

0

一个想法可能就是在表上设置一个触发器来设置一个权重字段,然后该权重字段可以被索引并用于排序。那么ORDER BY将非常有效,加权的丑陋将被隐藏在独立于任何SELECT语句的触发器中。这样做的缺点是如果表更新很多,然后触发它可能会减慢速度。

+0

以前没有使用过触发器。但有一种感觉会减慢速度。在练习中,'type'被计算为FIELD(...)。过滤器1到5 - 也设置为字段的变量。加上约4-5个连接在该表上完成。 – 2013-03-22 18:56:13

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