0

迅速な調査を行いましたが、私の問題の良い解決策ではないようです。

これが取引です。

テーブルを想像してください:

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

タイプ - 値の可能性: 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.* 
from t 
order by mysort, type desc

mysql の concat 演算子が bool を 0/1 の文字列に自動キャストしない場合は、それらを内部式でキャストする必要があります。

(3,2) の型の並べ替えの条件を最初に見逃していました。元のアプローチと同様の第 2 レベルの並べ替えを使用することもできますが、それには type フィールドのみが含まれるため、それほど複雑ではありません。

于 2013-03-21T20:57:22.750 に答える
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

1 つのアイデアとしては、重みフィールドを設定するトリガーをテーブルに配置し、インデックスを作成して並べ替えに使用することです。そうすれば、ORDER BY は非常に効率的になり、重み付けの見苦しさは、SELECT ステートメントとは無関係のトリガーに埋もれてしまいます。その欠点は、テーブルが頻繁に更新される場合、トリガーを使用すると処理が遅くなる可能性があることです。

于 2013-03-21T21:11:22.610 に答える