1

次のようなmysqlテーブルがあります。id, [.....], priority

優先度フィールドは、必要に応じてテーブルを並べ替えるために使用されます。それは人間の知性に基づいています。私はそれにいくつかの値を持っています:

id, priority
1, 1
2, 7
3, 2
4, 4
5, 6
6, 5
7, 3

そして2番目(最大)の問題:たとえば、優先度に応じて4番目の要素を上下移動したい。

4 番目の要素を上 (左) と下 (右) に移動

    1, 1         1,1
    2, 7         2,7
    3, 2         3,2
    4, 3         4,5
    5, 6         5,6
    6, 5         6,4
    7, 4         7,3

ajax経由で呼び出され、サーバー側で多くのクエリを実行したくないため、単一のmysqlクエリで実行したい。

4

3 に答える 3

0

4 つ下に移動する必要がある場合:

UPDATE your_table AS t1 JOIN your_table AS t2 ON (t1.id = 4 AND t2.priority = t1.priority + 1) SET t1.priority = t2.priority, t2.priority = t1.priority

または、2 つ上に移動する必要がある場合は、次のようにします。

UPDATE your_table AS t1 JOIN your_table AS t2 ON (t1.id = 2 AND t2.priority = t1.priority - 1) SET t1.priority = t2.priority, t2.priority = t1.priority
于 2012-05-11T09:38:02.213 に答える
0

優先順位を上下に変更すると、優先順位が入れ替わるだけではありませんか? ここに良い解決策があります: Swap values in 2 rows SQL . これにより、レコード 1 と 4 の優先順位が入れ替わります。

UPDATE yourtable AS t1
JOIN yourtable AS t2 ON 
       (t1.id = 1 AND t2.id = 4)
    OR (t1.id = 4 AND t2.id = 1)
SET
    t1.priority = t2.priority,
    t2.priority = t1.priority

実際、優先度が一意の場合は、ID を使用せずにスワップし、優先度のみを使用できます。これは優先度 4 と 5 を入れ替えます。

UPDATE yourtable AS t1
JOIN yourtable AS t2 ON 
       (t1.priority = 4 AND t2.priority = 5)
    OR (t1.priority = 5 AND t2.priority = 4)
SET
    t1.priority = t2.priority,
    t2.priority = t1.priority
于 2012-05-11T09:33:29.353 に答える
-1
$int_prio = (1 - ((int)($_POST['move_up'] == 'TRUE') * 2));
$int_id = (int)$_POST['id'];

mysql_query("
INSERT INTO table_name (id, priority)
SELECT h2.id, 
    (h2.priority + ({$int_prio} * (1 - (2 * (h.id != h2.id))))) AS priority
FROM (  SELECT id, priority
        FROM table_name
        WHERE id = {$int_id}
        HAVING priority BETWEEN 2 AND ( SELECT MAX(priority)
                                        FROM priority
                                        GROUP BY '1') - 1) AS h
INNER JOIN priority AS h2
ON h.priority IN (h2.priority, h2.priority + {$int_prio})
ON DUPLICATE KEY UPDATE priority = VALUES(priority)
");

基本的に $_POST (より安全な方が望ましい) とtable_name.

最高および最低の優先度も変更しようとしないように、検証を追加しました。

上記のクエリがわかりにくい場合は申し訳ありませんが、これは検証を追加して単一のクエリですべてを更新する方法です。

于 2012-05-11T09:29:11.673 に答える