0

进行了快速研究,似乎对我的问题没有很好的解决方案。

这是交易。

想象表:

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

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

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

  1. 类型 = 3,过滤器1 = 1;
  2. 类型 = 2,过滤器1 = 1;
  3. 类型 = 1,过滤器1 = 1;
  4. 类型 = 3,过滤器2 = 1;
  5. 类型 = 2,过滤器2 = 1;
  6. 类型 = 1,过滤器2 = 1;
  7. 类型 = 2,过滤器 3 = 1 和过滤器 4 = 1;
  8. 类型 = 3,过滤器 3 = 1 和过滤器 4 = 1;
  9. 类型 = 1,过滤器 3 = 1 和过滤器 4 = 1;
  10. 类型 = 2,过滤器 3 = 1 和过滤器 5 = 1;
  11. 类型 = 3,过滤器 3 = 1 和过滤器 5 = 1;
  12. 类型 = 1,过滤器 3 = 1 和过滤器 5 = 1;
  13. 输入 (3,2), filter4 = 1;
  14. 类型 = 1,过滤器4 = 1;
  15. 输入 (3,2), filter5 = 1;
  16. 类型 = 1,过滤器5 = 1;

因此,结果的顶部将是满足条件号 1. 的行,然后是满足条件号 2 的行,依此类推。

希望这是对问题的明确解释。

谢谢。

ps当前的工作解决方案是拥有一堆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

但这似乎需要优化

4

3 回答 3

0

@埃尔罗伊弗林

不知道这个查询应该如何工作。这是我得到的:

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
于 2013-03-22T18:49:45.727 回答
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) 中进行排序的条件。您可以使用类似于原始方法的二级排序,但由于它仅涉及类型字段,因此应该不那么复杂。

于 2013-03-21T20:57:22.750 回答
0

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

于 2013-03-21T21:11:22.610 回答