2014-03-03 46 views
1

我知道这个论点已经在本网站多次讨论过,我只是找不到一个可行的解决方案,所以我想我会发布我的具体案例给你,也许你可以帮助我...无法从子查询中的同一表中删除

我有一个节日,我需要消除比前一天晚上的平均评价低20%的歌曲。

我这个尝试:

DELETE FROM concorre AS C 
WHERE C.dataSer='2014-02-24' 
AND C.votoTot<(SELECT AVG(B.votoTot) 
       FROM concorre AS B 
       WHERE B.dataSer='2014-02-23')/5 

它解决了 “同桌的问题”,但还是给我一个错误:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AS C WHERE C.dataSer='2014-02-24' AND C.votoTot<(SELECT AVG(votoTot) FROM concor' at line 1

+0

当你的子查询将返回所有条目的相同值有你使用参数认为,这将删除有关子查询的错误,并可能提高性能。 – talegna

+0

当命名表时,你不应该使用'AS'。多数民众赞成在当你命名列可以使用'AS' –

回答

0

试试这个

DELETE c FROM concorre C 
JOIN (SELECT AVG(B.votoTot) average FROM concorre B WHERE B.dataSer='2014-02-23') d 
WHERE C.dataSer='2014-02-24' 
AND C.votoTot < d.average /5 
+0

您的查询工作,非常感谢,但我没有得到什么“删除C”的意思是...什么是C – Febz

+0

这是一个考试,所以我需要请确保我了解它的每一个细节 – Febz

+0

c是您从中删除的表的名称。由于您加入了多个表格,因此您需要指出从哪个表格中删除。 '从协调C'删除c。由于delete语句中有多个表,所以'DELETE FROM concorre c'将失败。但是'DELETE c'指示哪个表从中删除与WHERE相匹配。 –

0

MySQL不允许在语句的任何子查询中选择外部查询中正在更新/删除的表。

这里您将从concorre表中删除并且在子查询中引用相同的表。

你可以尝试这样的事情:MySQL DELETE FROM with subquery as condition