2012-01-11 37 views
4

我做3個查詢重新安排我的表縮短SQL查詢

SELECT @i:=0; 
UPDATE imagedata SET imagedata.rank = 0; 
UPDATE imagedata SET imagedata.rank = (SELECT @i:[email protected]+1) WHERE imagedata.kategorieID = 1; 

的我執行從上到下的行。

問:還有一個更短的方法來做到這一點?


THX所有反饋.. 但我有一個目前存在的愛迪爾現在: 不知怎的,我必須與「ID(主鍵)」 collumn「連接」的「kategorieID」 所以我需要這兩個信息存儲到 「等級」 collumn格式,如:

CXXX

C =類別數(0〜4) XXX = ID(1 ... N)..獨一無二的!

爲例:輸出:

rank 
+------+ 
+ 1001 + 
+ 1002 + 
+ 1003 + 
+ ... + 
+ 1018 + 
+ ... + 
+ 2001 + 
+ 2002 + 
+ 1019 + 
+ 1020 + 

到目前爲止,我這樣做是這樣的:

UPDATE imagedata SET imagedata.rank = (SELECT CONCAT(kategorieID,"",LPAD(id,3,'0'))) WHERE id=88; 

一旦 「等級」 被數據填充它給我的abillity換2組的ID。

因此,我必須: 1)得到 「等級」 ID_1的collumn和ID_2 2)獲得該串爲例的子串( 'XXX'):( 「004」 .. 「012」) 3) ID_1「等級」和ID_2「等級」的交換子

SELECT @ix1:=SUBSTRING(rank, -3) FROM imagedata WHERE id=88; 
SELECT @ix2:=SUBSTRING(rank, -3) FROM imagedata WHERE id=83; 

..我知道如何得到它,但不知道如何交換呢?

+6

我可以備份一個步驟並詢問爲什麼您需要這樣做嗎? – 2012-01-11 21:41:00

+0

第二個查詢可能可以省略。 – TimWolla 2012-01-11 21:44:39

+1

@TimWolla,我也這麼認爲,但後來他意識到他基本上想要將所有'rank's設置爲0,除了那些'kategorieID'爲1的應該遞增。 – 2012-01-11 21:47:09

回答

1

我會修改第二個查詢只更新行不會在第三次更新,就像這樣:

SELECT @i:=0; 
UPDATE imagedata SET imagedata.rank = 0 WHERE imagedata.kategorieID <> 1; 
UPDATE imagedata SET imagedata.rank = (SELECT @i:[email protected]+1) WHERE imagedata.kategorieID = 1; 

編輯:每Lamak的評論,如果kategorieID可能是NULL你」會想這樣做,而不是:

SELECT @i:=0; 
UPDATE imagedata SET imagedata.rank = 0 WHERE imagedata.kategorieID <> 1 OR imagedata.kategorieID IS NULL; 
UPDATE imagedata SET imagedata.rank = (SELECT @i:[email protected]+1) WHERE imagedata.kategorieID = 1; 

而且,它可能是這個解決方法可能比你慢,尤其是如果沒有上kategorieID的索引。我這樣說,因爲即使你正在更新更少的行,它現在必須首先在WHERE上進行過濾。也許你應該首先測試它的性能,看它是否真的更快。

+0

這也許沒問題,但這樣你就省略了具有'NULL'類別的行 – Lamak 2012-01-11 21:47:28

+0

謝謝@Lamak,我已經相應地更新了我的答案。 – 2012-01-11 21:54:25

+0

thx尋求幫助。 – Don 2012-01-12 00:52:39