2012-08-09 83 views
0

我有一個名爲list列這是在我的訂單通過使用(在MYSQL查詢)列表中的號碼:(例如1至20)列表更新 - 排衝突

此列表,然後使用mysql命令輸出通過list ASC - 但是,當我使用Jquery拖放UI列表更新後端列表時,它應該更新列表前端。

我的問題是我的列表順序有時會與其他行發生衝突,因爲可能有兩行或三行的值爲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

+1

將第二個條件添加到您的ORDER BY子句會不會更容易? 'ORDER BY list ASC,category ASC'? – andrewsi 2012-08-09 19:12:05

+0

按類別排序會有什麼不同? - 原因列表是這樣的,以便項目可以自定義放置在一個頁面上 - 這意味着他們可以是一天的訂單1(前端)和訂單5(前端)下一個..我只需要將該列表作爲管理員/項目經理已經拖拽了後端列表來匹配前端...這需要我更新'list',當有多於一個的時候,它會經過項目名稱的ASC - 這可能不是它被放置在後端.. – Andrew 2012-08-09 19:16:00

+2

我的意思是你可以在ORDER BY中添加額外的列,這樣如果你的'list'列有3行值爲1,那麼你可以對第二列的值進行排序。它避免了必須做混亂的更新。如果那不是你所追求的,我能不能請你在你的問題中增加一個實際的例子,因爲我已經讀過了上述六次,我無法理解它。 – andrewsi 2012-08-09 19:22:43

回答

2

@andrewsi更新該類別中的所有行是正確的,尤其是我建議order by list ASC, last_update DESC所以在你更新list相同的查詢,你可以時間戳last_update,因此你將不再需要使用觸發器或任何其他更新。

+0

這個選項並不是太棒了,但它可以。 – Andrew 2012-08-09 22:04:26

+0

thk,這是直接的方法 – 2012-08-10 13:55:43

2

一般來說,安德魯西和路易斯所說的是真實的。而不是(像安德魯斯說的)「做雜亂的更新」,你應該考慮訂購第二欄。

但是,我可以看到你的觀點。我知道可以應用的一種類似情況是在CMS中,通過在項目旁邊的文本字段中手動更改訂單號,讓後端用戶訂購項目,例如,

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

...在[]數量將被新的秩序。

因此,一個相當混亂的解決辦法是(很多步驟,但如果你不擔心性能可能是好你,我不知道):

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

,然後作爲第二步驟

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

,然後循環通過從選擇和foreach行更新獲取數組(:i是增加指數)

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

PS:你將不得不添加一個帶有時間戳值的列timestamp_inserted
PPS:爲了清楚地說明,我不會推薦這個,也從來沒有說過這是最好的做法(對於那些考慮downvote因爲這個)