0

タイトルは非常に紛らわしいと思います。私はそれを置くためのより良い方法を考えることはできません。

これが私のジレンマです。何百もの行で構成されるテーブルがあります。現在の列は、id(主キー)、mfgr(メーカー番号)、説明、価格です。製造元IDの方法により、87-10は87-11の前にありますが、mfgrで注文すると、これら2つの間に87-100が配置されます。したがって、別の方法で注文する必要があります(この場合、主キーの自動増分ID)。問題は、初期設定時にID 1が87-10に割り当てられ、ID2が87-20に割り当てられることです。将来のある時点で87-11を追加する必要がある場合は、87-10から87-20の間に表示する必要があります。とにかく、すべてのIDを1つシフトせずにこれを行うことは考えられません。それをする前に、私が考えていない別の方法は何でしょうか?

4

5 に答える 5

1

製造元番号を分割し、mfgr1、mfgr2 などの 2 つのフィールドに格納します。(例: 87-11 を 87 と 11 に分割)

次に、必要に応じて行を並べ替えることができます。

select * from table1 order by mfgr1, mfgr2;

注: mfgr1 と mfgr2 を整数として格納しない場合は、クエリ中に整数としてキャストすることをお勧めします。

ソルン 2:

これも機能する必要があります。

select * from table1 order by convert(substring(mfgr,1,instr(mfgr,'-')-1), UNSIGNED INTEGER), convert(substring(mfgr,instr(mfgr,'-')+1), UNSIGNED INTEGER);
于 2012-12-15T04:37:15.983 に答える
0

遅くなる可能性がありますが、次のような独自の関数を作成できます。

  1. -記号を使用してフィールドを2つの数値に分割します(引き続き文字列として扱われます)。
  2. MySQL LPAD()関数を使用して、両方の数値が左側に同じ数のゼロで埋められていることを確認します。
  3. 2つのパディングされた数値文字列を再結合し、結果を関数に返します。
  4. クエリのWHERE句に関数を適用します。

ただし、一部のアドホックレポートにはこのような方法のみを使用します。それ以外の場合は、クエリが頻繁に実行される場合は2つの列に分割します。

于 2012-12-15T04:49:49.947 に答える
0

他の回答では、すべてのメーカー番号が##-#...(* 2桁-1桁以上)であると想定しています。そうではないかもしれませんし、今は真実かもしれませんが、保証されていないかもしれません。これは、「どのアルゴリズムで行の順序を維持できるか」ではなく、データベース設計の問題です。製造元IDが常に数値で並べ替える必要のある2つの数値コンポーネントである場合、2つの数値列として格納し、表示用に1つとしてフォーマットする必要があります。 「行を順番に挿入する」ことを考えるのは意味がありません。主キーを変更する必要はありません。IDに自動インクリメントを使用しているようです。その場合、IDは行を一意に識別します。行を並べ替えるには、クエリにORDERBY句が必要です。

于 2012-12-15T04:56:51.250 に答える
0

-メーカー番号を1 つの番号なしで保存し、-画面に表示するときにのみ表示します (最初の 2 桁の後に - を挿入し直します-)。

于 2012-12-15T04:38:45.783 に答える
0

次のようなものを使用してそれを行うことができるはずです

SELECT * FROM table1 ORDER BY CAST(`mfgr` AS SIGNED) DESC
于 2012-12-15T04:40:41.180 に答える