3

私は mysql db のソート構文を使用していますが、列の完了によって行をソートしたいと考えています。例が問題を説明することを願っています:

id |t1 | t2 | t3 | t4
----------------------
 1 | a |  b |  c | d
 2 |   |  e |    |
 3 | f |  g |    |
 4 | h |  i | j  |

これは私の行/列構造です。ご覧のとおり、一部のフィールドは空です。入力が次のようになるようにテーブルを並べ替えたい

id |t1 | t2 | t3 | t4
----------------------
 1 | a |  b |  c | d
 4 | h |  i | j  |
 3 | f |  g |    |
 2 |   |  e |    |

入力された (空でない) フィールドの数でソートされています。これを行う最も簡単な方法は、次のようなクエリでソートすることです。

SELECT id, t1, t2, t3, t4 FROM table ORDER BY t1 DESC, t2 DESC, t3 DESC, t4 DESC

ほとんどの場合は問題なく動作しますが、テーブルが次のようになっているとどうなるかを見てください。

id |t1 | t2 | t3 | t4
----------------------
 1 |   |  b |  c | d
 2 |   |  z |    |

並べ替え後:

id |t1 | t2 | t3 | t4
----------------------
 2 |   |  z |    |
 1 |   |  b |  c | d

なんで?並べ替え順序が降順で、t1 列が空 (無視される) で、次の列が t2 であるためです。また、残りの列を無視して降順でソートされます (列が空の場合)。

ここで同様の問題が解決されていることがわかりました(推測-まだチェックされていません)、解決策は厄介に見えます。空でない列の数でテーブルを並べ替える他のアイデアはありますか?

4

2 に答える 2

3

関連するすべての列の結果を合計し、IS NULLそれIS NOT NULLをプライマリ ソートとして使用して基本的な問題を解決してから、必要なセカンダリ ソートを適用する必要があります。

null 以外の列の値が同じ数の 2 つの行をどのように並べ替えるかはわかりませんが、左から右に昇順で並べ替えたいと思います。その場合、これはうまくいくはずです。

(更新:eggyalが指摘したように、「空」とは、NULLではなく空の文字列を意味します。以下の更新されたクエリを参照してください):

SELECT id, t1, t2, t3, t4 
FROM table 
ORDER BY ((t1 = '') + (t2 = '') + (t3 = '') + (t4 = '')) ASC, 
t1 DESC, t2 DESC, t3 DESC, t4 DESC
于 2013-01-14T15:02:32.170 に答える
3

レコードごとにスコアを作成し、それをソートする必要があります。各フィールドが「空」であるかどうかをテストし、合計を取得してから、昇順でソートすることをお勧めします (スコアが最も低い、つまり空のフィールドが最も少ないレコードが最初になるようにします)。

次のようなスコアを作成するために、MySQL の真のブール型の欠如を悪用できます。

ORDER BY (t1 IS NULL) + (t2 IS NULL) + (t3 IS NULL) + (t4 IS NULL)

または、「空の」フィールドが実際には空の文字列''である場合NULL:

ORDER BY (t1 = '') + (t2 = '') + (t3 = '') + (t4 = '')
于 2013-01-14T14:57:15.430 に答える