2013-03-21 34 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