0

(MYSQLクエリで)私の順序で使用されると呼ばれる列がlistあり、リスト内には数字があります:(たとえば1から20)

このリストは、ASCによるMYSQLの順序を使用して出力されますlist-ただし、JqueryドラッグアンドドロップUIリストを使用してバックエンドでリストを更新すると、リストのフロントエンドが更新されることになっています。

私の問題は、リストに値1の行が2つまたは3つある可能性があるため、リストの順序が他の行と競合することがあることです。したがって、順序が更新されるときに、行が+1の場合にのみ、他の行を+1で更新する方法を知りたいです。 >=指定された注文番号

列を一意にすることを目的としていないため、列をプライマリにしたくありませんlist。これは、複数のカテゴリがあり、各カテゴリですべて1から始まるためです。したがって、一意にすると、異なるカテゴリに複数の1があったため、エラーが発生します。

トリガー関数を使用してPL/SQLを試すことができると言った友人に尋ねましたが、これは私にとって新しい根拠です-私はその言語を完全には理解しておらず、誰かがMYSQLまたはPL/SQLですら。

これは私がこれまでに持っているものです:

<?php
$project = mysql_real_escape_string(stripslashes($_POST['pid']));
$category = mysql_real_escape_string(stripslashes($_POST['cat']));
$order = mysql_real_escape_string(stripslashes($_POST['order']));
// need to do update the moved result (list row) and update all conflicting rows by 1
mysql_query("UPDATE `projects` SET `cat`='$category',`list`='$order' WHERE `id`='$project'")or die(mysql_query());
?>

結論:

一意でない列を更新して、その個々のカテゴリに一意の値を設定しようとしています。そのカテゴリのすべての行を+1で更新する方法がわかりません

4

2 に答える 2

2

@andrewsiは正しいです。特に、order by list ASC, last_update DESC更新する同じクエリでlistタイムスタンプlast_updateを付けることができるため、トリガーやその他の更新を使用する必要がないことをお勧めします。

于 2012-08-09T20:17:19.160 に答える
2

一般的に、andrewsiとLuisが提案したことは真実です。(andrewsiが言ったように)「面倒な更新を行う」のではなく、2番目の列で並べ替えることを検討する必要があります。

しかし、私はあなたのアプローチに対するあなたのポイントを見ることができるかもしれません。私が適用できると私が知っている同様の状況の1つは、バックエンドユーザーがアイテムの横のテキストフィールドで注文番号を手動で変更することによってアイテムを注文できるようにするCMSです。

item 1 - [ 1 ]
item 2 - [ 3 ]
item 3 - [ 2 ]

...その場合の番号[]は新しい注文になります。

したがって、非常に厄介な解決策は次のようになります(多くの手順ですが、パフォーマンスについて心配する必要がない場合は、問題ないかもしれませんが、わかりません)。

INSERT INTO projects (cat, list, timestamp_inserted) VALUES (:cat, :list, NOW())

そして2番目のステップとして

SELECT id, list FROM projects WHERE cat=:cat ORDER BY list ASC, timestamp_inserted DESC

次に、selectおよびforeach行の更新から取得した配列をループします(:iは増加するインデックスです)

UPDATE projects SET list=:i WHERE id=:id

timestamp_insertedPS:タイムスタンプ値を持つ 列を追加する必要があります。
PPS:明確に述べると、私はこれをお勧めせず、ベストプラクティスとは決して言いませんでした(このために反対票を投じることを検討している人にとって)

于 2012-08-09T21:12:26.367 に答える