2017-09-22 84 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