2014-06-24 33 views
0

我有一個表,其中一個新的主菜得到一個數字0,並且未公佈狀態。用戶可以發佈或取消發佈行。當他們這樣做時,發佈的行應該得到一個連續的數字,但未發佈的行應該被跳過。就像這樣:設置序列號只行具有相同的值

status  | number 
============================= 
unpublished | 0 
published | 1 
unpublished | 0 
unpublished | 0 
published | 2 
published | 3 
unpublished | 0 
published | 4 

現在我使用:

mysql_query("update albums 
join (SELECT @i:=0) t 
SET id =(@i:[email protected]+1)"); 

當用戶發佈的東西,但將連續的號碼添加到所有行。 我需要類似上面的內容,但是有某種WHERE =已發佈的語句,但我不知道如何。 我應該看什麼解決方案?

非常感謝,

山姆

+1

「發表行應該得到一個數字,就是連續的」爲什麼呢? – Strawberry

+0

也許這是正確的答案..我需要一個連續的數字,以編號所有主菜。但我會更好地在PHP中檢索結果之後執行此操作,而不是在數據庫本身中執行此操作。 – Sam

+0

上面的註釋表明只有一個實例需要某行數,但在不同的實例中看起來最好有一個真正的數字數據庫方面的數字。 – Sam

回答

1

UPDATE語句嘗試的IF: -

UPDATE albums 
JOIN (SELECT @i:=0) t 
SET id = IF(status='published', @i:[email protected]+1, 0) 

然而,這不會因爲我想你想我懷疑沒有ORDER工作始終BY子句(更新支持和訂單子句)。

編輯 - 更多信息請求: -

相冊是一個MySQL表。 MySQL中的UPDATE查詢確實支持ORDER BY子句(以特定順序更新記錄),但僅限於只有一個表的查詢。在這個查詢中,一個子查詢被加入到相冊表(即JOIN (SELECT @i:=0) t);即使這實際上不是一個表,它似乎MySQL將它視爲一個,因此不會允許此更新中的ORDER BY子句。

但是@i是一個用戶定義的變量,可以通過單獨的SQL語句進行初始化。如果您的查詢語句2 -

SET @i:=0 
UPDATE albums 
SET id = IF(status='published', @i:[email protected]+1, 0) 
ORDER BY albums.insert_date; 

那麼應該這樣做(注意,我剛纔假設insert_date的隨​​機列名通過訂購的記錄)。

然而,許多MySQL API不支持在單個查詢中使用多個語句。由於@i是一個用戶變量,它與連接到數據庫有關。因此,如果您發出一個查詢來初始化它,然後第二個查詢(使用相同的連接)來處理更新它應該工作。

如果您使用的庫MySQLi PHP那麼你可以使用mysqli-multi-query來一氣呵成執行兩個。

+0

這就像一個魅力 – Sam

+0

你將如何集成該ORDER BY子句? – Sam

+0

我不確定你可以強制下單。我不認爲當使用多個表時,UPDATE支持ORDER BY子句,並且初始化@i的子查詢似乎被視爲表。想想在查詢之前你需要刪除連接並使用一個單獨的'SET @i:= 0;',這將允許你添加一個SORT到UPDATE。 – Kickstart

0

的kickstart答案几乎是我需要的,只有當主菜被公佈應當始終得到的最高數字。現在它遵循數據庫順序,這是按日期。我應該整合一個ORDER BY,還是有不同的解決方案?

感謝