生活的沉淀态 希望的萌芽态 平静色|包容色|希望色
« »
2010-12-18博客建设

阅读 256 次

向大家求助一个mysql的问题

对于评论的回复,目前流行的主要有两种形式,一种是嵌套评论;另一种是’@评论者’带有悬浮效果。大多博客使用的是嵌套评论,因为嵌套评论更适合较深层次的讨论,我也不例外,前期一直使用嵌套评论。现在换主题了,不想支持嵌套了,取消wordpress的嵌套后,原先有层次的评论就孤立起来而且没有’@评论者’,也就是没有悬浮了。

我现在想做的事就是将以前的子评论内容最前面都刷上’@评论者’,从而能够通过悬浮效果看到被回复的评论,刷数据的思路很简单,父子评论是通过wp_comments表的comment_parent字段关联的,只要过滤出comment_parent不为空的记录,然后更新comment_content字段就可以了,用习惯了oracle的我以为一个sql可以很轻松的搞定,谁知道mysql居然不支持一下形式的更新嵌套:

update wp_comments b
set b.comment_content = concat('@',
(select a.comment_author
from wp_comments a
where a.comment_id = b.comment_parent),
'\n',
b.comment_content)
WHERE b.comment_id is not null

出错提示为:
#1093 – You can’t specify target table ‘b’ for update in FROM clause

错误提示

查了一下mysql的相关文档,大概就是不允许在子查询同时更新或者删除原数据表数据,知道为什么出错,不过在网上找来一圈,不知道如何依然用一个sql搞定这个功能,只能看着phpMyAdmin发呆了,希望有mysql基础比较扎实的朋友指点迷津,感激不尽,没感激涕零,好人好报,等等等等。

********问题已经解决,以下是自己想出的解决办法

首先拷贝一份评论表的数据到另一张表wp_comments_tmp

--这个临时表等数据更新后删除就可以了
create table wp_comments_tmp as (select * FROM wp_comments WHERE 1 );

然后通过wp_comments表和wp_comments_tmp表的关联,正确SQL如下:

update wp_comments b
   set b.comment_content = concat('<a href="#comment-',
                                  b.comment_parent,
                                  '">',
                                  '@',
                                  (select a.comment_author
                                     from wp_comments_tmp a
                                    where a.comment_id = b.comment_parent),
                                  '</a>\n',
                                  b.comment_content)
 WHERE b.comment_id in
       (select comment_id
          from (select * from wp_comments where comment_parent != '0') as temp)

这个SQL得来也不算容易,最先写好的是下面这样的:

update wp_comments b
   set b.comment_content = concat('<a href="#comment-',
                                  b.comment_parent,
                                  '">',
                                  '@',
                                  (select a.comment_author
                                     from wp_comments_tmp a
                                    where a.comment_id = b.comment_parent),
                                  '</a>\n',
                                  b.comment_content)
 WHERE b.comment_id != '0'

这样更新的话,结果是把所有评论内容都被清空了,纠结的一笔,我把update换成select,发现查出的内容果然都是空的,到底是什么原因,我也不太清楚,懂的人解释一下吧。这个sql不行,我就继续改,改成以下形式,用in的形式:

update wp_comments b
   set b.comment_content = concat('<a href="#comment-',
                                  b.comment_parent,
                                  '">',
                                  '@',
                                  (select a.comment_author
                                     from wp_comments_tmp a
                                    where a.comment_id = b.comment_parent),
                                  '</a>\n',
                                  b.comment_content)
 WHERE b.comment_id in
      -- 这里又犯了那个错,不能在子查询里更新原表数据
       (select comment_id from wp_comments where comment_parent != '0')

这个SQL又报1093错误了,最后没辙,继续使用子查询构建临时数据才得到最终可以正确更新的SQL,真是不容易啊,啥时候SQL能强大点啊。

日志信息 »

该日志于2010-12-18 23:21由 世纪之光 发表在博客建设分类下, 你可以发表评论。除了可以将这个日志以保留源地址及作者的情况下引用到你的网站或博客,还可以通过RSS 2.0订阅这个日志的所有评论。

相关日志 »

45条评论

  1. 白手 说道:

    嗯……你这个问题这样这样……那样那样……就解决了,听明白了吗?好了,那我走了。

  2. 世纪之光 说道:

    @白手
    我靠,你丫的,真是不厚道,你以为我们有心灵感应啊,鄙视鄙视你 :x

  3. 白手 说道:

    发现你博客侧栏的 赞助链接 了,一个链接你能有多少钱拿啊?给我也介绍两个客户吧

  4. 白手 说道:

    @世纪之光
    其实搞嵌套评论更好,因为以后肯定是嵌套回复的天下

  5. 世纪之光 说道:

    @白手
    老兄,我这没要他钱,许哥儿的搞的几个站,他要给钱,我没好意思要,都是圈子里的朋友,实在不好意思,先挂几个月。

  6. 世纪之光 说道:

    @白手
    对于我这样的博客,我觉得能讨论问题的可能不大,嵌套不是很需要,一个问题最多讨论两三句也就结束了。

  7. 白手 说道:

    @世纪之光
    不要钱这么好?你介绍给我吧,我边你那份一起收了,嘿嘿

  8. 世纪之光 说道:

    @白手
    晕,彻底受不了你,许哥儿的博客你去留言联系他吧。

  9. 朗朗 说道:

    早上来看下.没更新???

  10. 八斗文档网 说道:

    关注一下 呵呵!

  11. 朗朗 说道:

    本人发布了一篇文章—60元息壤空间可以放置100个独立域名网站..老大来看看…

  12. 朗朗 说道:

    小弟新发博文—–朗朗疑问–可否一分钱不花,买到联想笔记本??

    欢迎探讨..广告勿扰..

  13. 世纪之光 说道:

    @朗朗
    呵呵,你更新的倒是很勤快,不过以前这样的更新通知,可以放到留言页面里,放文章评论里面跟文章毫无关系,多谢理解。

  14. 宿迁学院论坛 说道:

    哈哈 解决了就好
    干嘛不用嵌套呢~

  15. 韩国 说道:

    过来看看,学习学习。

  16. 小松 说道:

    帮不了你喽~

  17. 半导体制冷片 说道:

    文章分析很有深度

  18. 世纪之光 说道:

    @宿迁学院论坛
    没有不用嵌套,以后想用的话,直接开放就可以了,目前不用而已,哈哈。

  19. 免费域名 说道:

    不了解就不要随便写,自己多做做功课再来

  20. 世纪之光 说道:

    @免费域名
    你要是懂的话就仔细点看看,如何解决比较方便,倒是请你赐教一下。在这里站着说话不腰疼有什么意义?

  21. 算啦,我的mysql不好,就会一个备份导出导入,还常常出错。

  22. 朗朗 说道:

    这个主题.感觉有点慢…插件太多了吧?

  23. 朗朗 说道:

    龌龊的我,又来留言了.
    为啥俺的博客都建了1天.百度咋还不收呢?

  24. 马路小生 说道:

    妈呀,看得眼花

  25. 马路小生 说道:

    @世纪之光
    那些个 换肤堂 衣品天成 金蛋香
    是许哥儿的?

  26. 世纪之光 说道:

    @马路小生
    是他的啊,不过没收钱,免费给他挂一阵子呀,你有想法?哈哈。

  27. 疯狂营销 说道:

    mysql只会用,不会玩代码。。

  28. 龙城瓶子 说道:

    嵌套评论不挺好。。。

  29. 马路小生 说道:

    @世纪之光
    没有,看到换肤堂吓到我了,那些东西买过,是三无产品。。。

  30. 朗朗 说道:

    朗朗过来回访..学习了..

  31. ZCMHI 说道:

    推荐到露兜博客看一看,最新发布一篇关于wordpress批量更改信息的文章

  32. laofan 说道:

    基本看不懂,飘过

  33. 第六空间 说道:

    爱莫能助,不过搞SQL的人不少,北山主机好像是搞这个专业。

  34. 世纪之光 说道:

    @第六空间: 其实我挺纳闷的,按道理这个SQL非常简单了,不清楚为什么这么多人不懂……

  35. 卢松松 说道:

    这个还真是要等待高手回答

  36. 世纪之光 说道:

    @卢松松: 哎,看来研究数据库的人确认太少了,大概数据存储技术确实很难。

  37. 柳城 说道:

    这模板倒是不错…

  38. 宁波led显示屏 说道:

    学习了,多谢博主的分享

  39. 秋天一棵树 说道:

    太惭愧了自己没能帮上忙,昨天在书店看一本讲MySQL的书里面就列举了与Oracle、SQLServer、DB2这些商业数据库软件的比较,功能上的确还有一部分差距。

  40. zwwooooo 说道:

    比较少折腾数据库,没系统地学过

    • 世纪之光 说道:

      我也没有系统地学过,估计这方面的大神还真的是很少,你可以研究研究哈哈。数据存储技术可是相当牛逼的。

  41. leekic 说道:

    回访,博主还是技术帝?

发表评论 »



楚天互联:美国高速主机月付3元起, 域名注册优惠中..

返回顶部