2012-04-28 27 views
1

我使用表中的「排序」列排列相冊上的照片。 這意味着專輯將以「ORDER BY排序」顯示。使用「排序」列排列MySQL表中的行

我有一個功能,允許用戶通過在javascript中拖放照片來安排相冊上的照片,然後按下「保存」按鈕。

一個數組(帶有排序的照片ID)被髮送到進程(在PHP中),然後我想重新排序表上的行。

在我的腦海裏做的最簡單的方法是:

for ($c=0; $c<$length; $c++) { 
    mysql_query('UPDATE photos SET sort="'.$c.'" WHERE id="'.$array[$c].'"'); 
} 

(請忽略消毒,重複這裏其他覈實)

但我擔心的是在做查詢量像這樣的一個循環。

你會如何改進這種方法?

謝謝。

+0

看起來很好。你可以嘗試在一個大的更新中合併它並消毒你的輸入,這樣你就不會受到sql注入的攻擊。 – Zombaya 2012-04-28 22:51:59

+0

@Zombaya謝謝。正如我在問題中所說的,請忽略衛生處理和其他驗證。但是,我將如何將它合併成一個大的更新?這就是我想要的,順便說一句。問題出在「WHERE」條款中。 – Nuno 2012-04-28 22:54:12

+0

我錯了,你不能那樣做。你可以使用插入語句來完成它,我切換了它們。我確實找到了一個[blog](http://www.kavoir.com/2009/05/mysql-update-multiple-rows-with-one-single-query.html),它可能會幫助你。 – Zombaya 2012-04-28 23:03:09

回答

2

首先,我不認爲有什麼不對發出多個查詢。你測試過了嗎?你確定這會是一個性能瓶頸嗎?我不這麼認爲。

但無論如何,解決方案#1是使用REPLACE連同VALUES條款。但是,在這種情況下,您需要明確指定表中所有列的數據,否則這些列中的數據將被刪除(設置爲默認值)。

解決方案#2只是爲了好玩。我想沒有人會使用它,但仍:

UPDATE photos 
SET sort = (
    SELECT sort FROM (
    SELECT 1 id, 1 sort UNION 
    SELECT 2 id, 2 sort UNION 
    SELECT 123 id, 3 sort) t 
    WHERE t.id = photos.id) 
WHERE id IN (1, 2, 123) 

解決方案#3幾乎是一樣的Zombaya的:

UPDATE photos 
SET sort = 
    IF(id = 1, 1, 
    IF(id = 2, 2, 
    IF(id = 123, 3, 
    0))) 
WHERE id IN (1, 2, 123) 
1

在我的評論中blog有這樣的解決方案

所有的
UPDATE `table_name` SET `field_name` = CASE `id` 
    WHEN '1' THEN 'value_1' 
    WHEN '2' THEN 'value_2' 
    WHEN '3' THEN 'value_3' 
    ELSE `field_name` 
END 
+2

不要忘記在'id'處添加一個WHERE,否則它會遍歷表中的每一行並嘗試更新它。 – 2012-04-28 23:19:30

1

如果您使用的預處理語句,你可以準備的聲明一次,然後運行幾次,每次照片一次。這比執行許多mysql_query更有效,因爲解析和查詢計劃只進行一次。