【问题标题】:How to select complex data from a table and delete it from the same table如何从一个表中选择复杂数据并从同一个表中删除
【发布时间】:2013-07-13 04:31:54
【问题描述】:

我有一个反馈表,其中包含根据某些实体的用户反馈和评级。在某些情况下,多个用户对同一实体进行了投票,这是不可取的,并且由于故障而进入了系统。

表架构有点像这样:

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)

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

关于如何仅使用查询来做到这一点的任何建议?

【问题讨论】:

  • 查看此评论稍后的链接,它会为您提供答案。你的表是 innodb 还是 MySIAM? stactkoverflow.com/questions/10554627/…
  • @Yoram 我的表是 InnoDB。
  • 好的,只是检查一下。因为 mysiam 在执行插入、更新或删除等操作时会锁定表,但也无法按照您查看链接的方式进行操作:)
  • @yoramdeLangen !!!现在无法访问该页面....我在一分钟前就可以做到...
  • 抱歉,链接中有错字:stackoverflow.com/questions/10554627/…

标签: mysql mysql-error-1093


【解决方案1】:

在 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
                              )

【讨论】:

  • 哈哈……这是什么魔法!!??让 MySQL 变得愚蠢。 :D
  • @RickeshJohn 。 . .额外的子查询级别强制 MySQL 实例化表(或至少让编译器意识到表已实例化,绕过警告)。
猜你喜欢
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 2014-02-17
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
  • 2013-05-25
相关资源
最近更新 更多