如何从表中选择复杂数据并将其从同一个表中删除

问题描述:

我有一个反馈表,其中包含用户反馈和按照某个实体的评分。有些情况下,多个用户对同一个实体进行投票,这是不可取的,并且由于故障而进入系统。如何从表中选择复杂数据并将其从同一个表中删除

表模式有点像这样:

qa_id,int(10) //id of the entity 
score,smallint(1) 
user_id,int(3) 
feed_time,datetime 

我试图删除重复项之一(幸好只有一个额外的反馈)与此查询:

delete from feedback where md5(qa_id+feed_time) in 
(
    select md5(qa_id+feed_time)from feedback fb 
    group by fb.qa_id 
    having count(fb.qa_id) > 1 
    order by fb.qa_id 
    desc 
) 

它失败说:

Error Code : 1093 
You can't specify target table 'feedback' for update in FROM clause 
(0 ms taken) 

,我不能选择,并从同一个表(即如果它删除出现在子查询中)。我没有太多的数据库专业知识,我也不允许使用任何编程语言来做同样的事情。 ?:(

我如何能做到这一点与查询仅

+0

结帐出来该链接后面的评论,它给你的答案是你的表innodb或MySIAM?http://stactkoverflow.com/questions/10554627/delete-from-having-count-in-mysql –

+0

@Yoram我的表是InnoDB –

+0

Oke,只是检查,因为mysiam在执行插入,更新或删除操作时会锁定表格,但它也不可能通过checkout链接:) –

在MySQL解决这个问题的最简单的方法有什么建议是将子查询中子查询的附加层:

delete from feedback 
where md5(qa_id+feed_time) in (select * 
           from (select md5(qa_id+feed_time) 
            from feedback fb 
            group by fb.qa_id 
            having count(fb.qa_id) > 1 
            ) t 
          ) 
+0

LOL ......这是什么样的魔术!!?让MySQL摆脱困境。 :D –

+2

@RickeshJohn。 。 。子查询的额外级别强制MySQL实例化表(或者至少让编译器意识到表被实例化,绕过警告)。 –