向大家求助一个mysql的问题

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

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

[sql]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[/sql]
出错提示为:
#1093 - You can't specify target table 'b' for update in FROM clause

错误提示

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

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

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

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

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

[sql]update wp_comments b
set b.comment_content = concat('',
'@',
(select a.comment_author
from wp_comments_tmp a
where a.comment_id = b.comment_parent),
'
\n',
b.comment_content)
WHERE b.comment_id in
(select comment_id
from (select * from wp_comments where comment_parent != '0') as temp)[/sql]
这个SQL得来也不算容易,最先写好的是下面这样的:
[sql]update wp_comments b
set b.comment_content = concat('',
'@',
(select a.comment_author
from wp_comments_tmp a
where a.comment_id = b.comment_parent),
'
\n',
b.comment_content)
WHERE b.comment_id != '0'[/sql]
这样更新的话,结果是把所有评论内容都被清空了,纠结的一笔,我把update换成select,发现查出的内容果然都是空的,到底是什么原因,我也不太清楚,懂的人解释一下吧。这个sql不行,我就继续改,改成以下形式,用in的形式:
[sql]update wp_comments b
set b.comment_content = concat('',
'@',
(select a.comment_author
from wp_comments_tmp a
where a.comment_id = b.comment_parent),
'
\n',
b.comment_content)
WHERE b.comment_id in
-- 这里又犯了那个错,不能在子查询里更新原表数据
(select comment_id from wp_comments where comment_parent != '0')[/sql]
这个SQL又报1093错误了,最后没辙,继续使用子查询构建临时数据才得到最终可以正确更新的SQL,真是不容易啊,啥时候SQL能强大点啊。

小雪转中雪

20 Comments On 向大家求助一个mysql的问题

  1. avatar

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

  2. avatar

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

  3. avatar

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

  4. avatar

    文章分析很有深度

  5. avatar

    帮不了你喽~

  6. avatar

    过来看看,学习学习。

  7. avatar

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

  8. avatar

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

  9. avatar

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

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

  10. avatar

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

  11. avatar

    关注一下 呵呵!

  12. avatar

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

  13. avatar

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

  14. avatar

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

  15. avatar

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

  16. avatar

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

  17. avatar

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

  18. avatar

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

  19. avatar

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

  20. avatar

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

| 真的AJAX提交哦

发表评论