0

MySQLテーブルには5つのフィールドしかありませんが、数百の行があります。良いアドバイス(tks Lacoz)で、重複した行を無視してテーブルを複製し、複製された行を含まない新しいテーブルを作成しました。

問題:新しいテーブルがスクランブルされた順序で入力されました(つまり、と呼ばれる最初のフィールドを観察するときrel_id)。これは現実の世界では問題ではありませんが、この時点では、同じ順序で並べておくと便利です(過去のメモなどを参照する場合)。

行の例:(これrel_idは自動インクリメントの主キーフィールドであることに注意してください)

'rel_id' => 1
'host' => 17
'host_type' => 'client'
'rep' => 7
'rep_type => 'cli_mgr'

ユーザーLacozが、重複することなく新しいテーブルを作成するのを手伝ってくれた方法は次のとおりです。

mysql_query("create table rels2 like rels");
mysql_query("alter table rels2 add unique index(host,host_type,rep,rep_type)");
mysql_query("insert IGNORE into rels2 select * from rels");

次のように、最後のクエリに「ORDERBY」を追加してみました。

mysql_query("insert IGNORE into rels2 select * from rels ORDER BY rel_id");

しかし、それは問題を解決しませんでした。行はまだスクランブルされた順序です。

最初の質問:なぜこれが起こったのですか?

2番目の質問:データが正しい順序で入力されたことをどのように確認できますか?

必要な結果:さまざまな理由で、データを以前の外観に戻す必要があります(ただし、重複はありません)。これを達成するために、誰かが別のアプローチ、さらにはphpスクリプトを提案できますか?

PS:グーグルで何度か検索した後、テーブルの生データを並べ替えることはできず、出力だけを並べ替えることができると思います。正しい?(概念と用語の両方の初心者がいつどこかから始めなければならないかを確認するのは難しいです)。

4

2 に答える 2

1

概念的には、リレーショナルデータベースのデータは特定の順序で保存されません。数学的には、それは1つまたは複数の集合であり、集合には順序がありません。そのため、SQLは特定の順序で行を挿入する方法を提供していません(たとえば、この行を最後、最初、他の行の後に挿入するなど)。これは、指定された順序付け基準を指定して、クエリの出力をフィルタリングする方法を提供するだけです。

もちろん、SQLの具体的な実装では、最終的にはある種の順序でディスクに格納する必要があります。そのため、ORDER BY句を指定せずにテーブルをクエリすると、順序が繰り返されることに気付きますが、それを当てにすることはできません。ソフトウェアは、行が任意の順序で出てくると想定する必要があります。

特定の順序で結果を出す必要がある場合はORDER BY、クエリで使用します。たぶん、適切なインデックスを作成して(まだない場合)、データベースが要求した順序を良好なパフォーマンスで生成できることを確認します。

于 2012-11-07T20:41:55.647 に答える
0

一意のインデックスを追加することで重複を解決できたため、auto_incrementにする場合は、新しい主キー値をロードする必要があります。したがって、提案されたクエリはこれです

mysql_query("insert IGNORE into rels2(host,host_type,rep,rep_type) select host,host_type,rep,rep_type from rels ORDER BY rel_id");

幸運を!

于 2012-11-07T21:04:49.513 に答える