2011-03-24 161 views
1

我在MySQL表中有一列,這一列表示我希望顯示每個字段的順序,我希望能夠更改行的編號,如果我改變了它會改變表格中的所有元素。使用MySQL和PHP重新排序列

例如:

item_name item_order 
item1  1 
item2  2 
item3  3 
item4  4 
item5  5 

,讓說,我想ITEM5是1,比新的結果集將是這樣的:

item_name item_order 
item5  1 
item1  2 
item2  3 
item3  4 
item4  5 

在此先感謝,板井。

回答

1

纔能有實現這種實用的功能很多方面。
這裏是很容易的一個的例子,只是給你一個想法:

$id = intval($_POST['id']); 
if (isset($_POST['up'])) { 
    $sort=dbgetone("SELECT sort FROM $table WHERE id=$id"); 
    $sort2=dbgetone("SELECT max(sort) FROM $table WHERE sort < $sort"); 
    if ($sort2) $id2=dbgetone("SELECT id FROM $table WHERE sort = $sort2"); 
} elseif (isset($_POST['down'])) { 
    $sort=dbgetone("SELECT sort FROM $table WHERE id=$id"); 
    $sort2=dbgetone("SELECT min(sort) FROM $table WHERE sort > $sort"); 
    if ($sort2) $id2=dbgetone("SELECT id FROM $table WHERE sort = $sort2"); 
} 
if ($sort2) { 
    $q1="UPDATE $table SET sort=$sort2 WHERE id=$id"; 
    $q2="UPDATE $table SET sort=$sort WHERE id=$id2"; 
    dbquery($q1); 
    dbquery($q2); 
}               

有「向上」和「向下」按鈕旁邊顯示的每一行,將它移到一個位置向後或向前

4

爲什麼不在所選查詢中使用order by clause

select * 
from your_table 
order by item_order 


使用的order by子句允許指定以何種順序結果必須進行排序 - 在這裏,在我的例子中,他們會按升序item_order進行排序。

+0

正確的,這是一個數據庫的目的。沒有必要重新排列表中的行。 – acme 2011-03-24 12:55:53

+0

這取決於,如果他想添加一個沒有共享位置的唯一排名,只需選擇...順序不會執行該任務,您需要更新該表以使「item_order」中的排名項目具有唯一性。 – Johan 2011-03-24 13:09:22

+0

瞭解順序,但是在這種情況下它並沒有幫助,因爲我想改變數據的順序。 – 2011-03-24 13:46:28

0

使用由

select * 
from table 
order by item_order 
0

如果你想讓數字運行的結果比你需要做出更新聲明如下所示。

如果您使列item_order成爲小數(10,1)而不是int,那麼您可以輕鬆地對排名數字重新編號。

item_name item_order 
item1  1 
item2  2 
item3  3 
item4  4 
item5  5 

update mytable set item_order = 0.5 where item_name = item5

item_name item_order 
item1  1 
item2  2 
item3  3 
item4  4 
item5  0.5 

那之後,你可以重新排列item_order在適當的整數爲了像這樣

set @order = 1; 
update mytable 
    set item_order = @order:= @order + 1 
    order by item_order asc; 

編輯

當然你也可以保留整數,並只使用偶數的排名並使用奇數在某處插入更改的排名。 然後,你會使用下面的查詢來更新...

set @order = 2; 
update mytable 
    set item_order = @order:= @order + 2 
    order by item_order asc; 
+0

當你寫@order = 1時,你指的是我給出的例子,但是這應該是現實世界實現中的一個變量,對吧? – 2011-03-24 13:35:02

+0

好吧,我在mysql中運行它 - 它工作得很好,但是當我在PHP中編寫它時,它說語法錯誤 – 2011-03-24 13:57:03