向大家求助一个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能强大点啊。

小雪转中雪

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

  1. avatar

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

    • avatar

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

  2. avatar

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

    • avatar

      @秋天一棵树 晕,不知者不怪啊,确实我们都没搞过这方面,只能自己硬着头皮往里面钻了,没辙。

  3. avatar

    学习了,多谢博主的分享

  4. avatar

    这模板倒是不错…

  5. avatar

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

  6. avatar

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

  7. avatar

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

  8. avatar

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

  9. avatar

    基本看不懂,飘过

  10. avatar

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

  11. avatar

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

  12. avatar

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

  13. avatar

    嵌套评论不挺好。。。

  14. avatar

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

  15. avatar

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

  16. avatar

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

  17. avatar

    妈呀,看得眼花

  18. avatar

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

    • avatar

      @朗朗 怎么可以如此妄自菲薄了,这样是不对的。同时也不能太心急。

  19. avatar

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

  20. avatar

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

| 真的AJAX提交哦

发表评论