2017-09-22 121 views
-1

我有這個表:MySQL的 - 遞增列值基於COUNT

enter image description here

現在,如果我算在id_racuna列不在NULL使用行:

SELECT COUNT (id_racuna) FROM racuni WHERE id_racuna IS NOT NULL; 

我得到:

enter image description here

所以,如果我在這樣的更新使用此值:

UPDATE racuni AS r1 JOIN racuni AS r2 ON r1.id_interesa = r2.id_interesa 
SET r1.id_racuna = (SELECT COUNT (r2.id_racuna) FROM r2 WHERE r2.id_racuna IS NOT NULL) +1, 
    r1.poslano = curdate() 
WHERE r1.id_interesa = 8; 

我希望得到:

enter image description here

,但我得到一個錯誤:

Table r2 doesn't exist!

我試着欺騙MySQL使用JOIN認爲r1r2是兩個不同的表,但它不起作用。我見過這種詭計here它在哪裏工作...我錯過了什麼?


UPDATE:

我需要使用JOIN因爲如果我寫的只是:

UPDATE racuni 
SET id_racuna = (SELECT COUNT (id_racuna) FROM racuni WHERE id_racuna IS NOT NULL) +1, 
    poslano = curdate() 
WHERE id_interesa = 8; 

我會得到錯誤:

Table 'racuni' is specified twice, both as a target for 'UPDATE' and as a separate source for data

+0

我的意思是你指的是兩張表作爲r2。也許嘗試沒有看到MySQL不高興的地方? – 0x11

+0

如果我不說,我會得到錯誤:表被指定兩次,既作爲'UPDATE'的目標,也作爲數據的單獨來源。 – 71GA

+0

哦,我明白了。那麼爲什麼不設置一個變量等於計數的值,然後在下面運行你的直接更新查詢? – 0x11

回答

1

用十字嘗試加入並在其中包裝你的子查詢

UPDATE racuni AS r1 
CROSS JOIN (SELECT COUNT (id_racuna) id_racunacount 
    FROM racuni 
    WHERE id_racuna IS NOT NULL) a 
SET r1.id_racuna = a.id_racunacount + 1, 
    r1.poslano = curdate() 
WHERE r1.id_interesa = 8; 
+0

This Works!你能解釋爲什麼我的解決方案不起作用,爲什麼你的作品? – 71GA

+0

由於您在'SET'子句中直接使用同一個表,因此您可以看到我在子選擇中計算了計數,並使用了一個交叉連接來創建一個單獨的數據集並給出了一個別名,就像'a'一樣,您可以這樣做通過從同一張表中進行選擇來更新同一張表 –

+0

不會使用'JOIN'而不是'CROSS JOIN'執行得更快嗎? – 71GA