织梦DEDECMS系统中文章内容为空 用SQL语句如何删除?

shape
shape
shape
shape
shape
shape
shape
shape
%title缩略图

织梦后台里提供了清空内容为空的文章,可是发现并不好用,有些空文章还是删除不了,而有些文章不是空的,只是采到了几个字,这些无法清除,于是就手动来清除这个文章.开始是一个一个文章找,一个一个来删除,后来觉得太累了,文章太多,不可能一个一个找,于是就到后台再找找,看看有没有什么可以用的.

突然发现后台里提供了一个功能[SQL命令运行器],对啊,我可以直接到数据库删除那些数据就可以了. [SQL命令运行器]功能不错,上方列出了所有表,而且提供了三个表功能:[优化表],[修复表],[查看表结构]. 列出的这些表名后面还显示了这个表里有多少记录,根据文章数量,一看就看到了第一个表的数量和文章数量一样,想必就是它了dede_addonarticle ,查看一下表结构,字段很少,如下:

——————————————————————————–
CREATE TABLE `dede_addonarticle` (
`aid` int(11) NOT NULL default ‘0’,
`typeid` int(11) NOT NULL default ‘0’,
`body` mediumtext,
PRIMARY KEY (`aid`),
KEY `typeid` (`typeid`)
) TYPE=MyISAM

——————————————————————————–
应该就是这个[body]字段.于是查询一下,看看有多少没内容或内容字数少于30的
——————————————————————————–
select * from dede_addonarticle where length(body)<30
——————————————————————————–
找到了,果然有一些,接下来,就删除啦.
——————————————————————————–
delete from dede_addonarticle where length(body)<30
——————————————————————————–

删除后,再看了看其他表,又发现一表的数据量和文章数是一样的[dede_archives],查看一下其结构如下:

——————————————————————————–
CREATE TABLE `dede_archives` (
`ID` int(11) unsigned NOT NULL auto_increment,
`typeid` int(11) unsigned NOT NULL default ‘0’,
`typeid2` int(11) unsigned NOT NULL default ‘0’,
`sortrank` int(11) NOT NULL default ‘0’,
`iscommend` smallint(6) NOT NULL default ‘0’,
`ismake` smallint(6) NOT NULL default ‘0’,
`channel` int(11) NOT NULL default ‘1’,
`arcrank` smallint(6) NOT NULL default ‘0’,
`click` int(11) unsigned NOT NULL default ‘0’,
`money` smallint(6) NOT NULL default ‘0’,
`title` varchar(80) NOT NULL default ”,
`shorttitle` varchar(36) NOT NULL default ”,
`color` varchar(10) NOT NULL default ”,
`writer` varchar(30) NOT NULL default ”,
`source` varchar(50) NOT NULL default ”,
`litpic` varchar(100) NOT NULL default ”,
`pubdate` int(11) NOT NULL default ‘0’,
`senddate` int(11) NOT NULL default ‘0’,
`arcatt` smallint(6) NOT NULL default ‘0’,
`adminID` int(11) NOT NULL default ‘0’,
`memberID` int(11) unsigned NOT NULL default ‘0’,
`description` varchar(250) NOT NULL default ”,
`keywords` varchar(60) NOT NULL default ”,
`templet` varchar(60) NOT NULL default ”,
`lastpost` int(11) NOT NULL default ‘0’,
`postnum` int(11) NOT NULL default ‘0’,
`redirecturl` varchar(150) NOT NULL default ”,
`mtype` int(11) NOT NULL default ‘0’,
`userip` varchar(20) NOT NULL default ”,
`locklikeid` smallint(6) NOT NULL default ‘0’,
`likeid` varchar(240) default ”,
PRIMARY KEY (`ID`),
KEY `click` (`click`),
KEY `senddate` (`senddate`),
KEY `typeid` (`typeid`),
KEY `arcrank` (`arcrank`),
KEY `sortrank` (`sortrank`),
KEY `pubdate` (`pubdate`),
KEY `litpic` (`litpic`),
KEY `typeid2` (`typeid2`)
) TYPE=MyISAM

——————————————————————————–
内容还真多,看看,感觉这个应该也是文章相关的表啊,看来,我之前太急了,应该和这个一起删,后来问了一下dedecms的QQ群上的[肥龙龙],果然是两个表关联的,通过dede_addonarticle.aid与dede_archives.id关联,前面那个表存储文章内容,后者存储标题,关键字,阅读次数,等.
没办法,再想办法来删除这个表里的吧.
以前没用过mysql,我直接用MSSQL的SQL方法,用嵌套查询,找出dede_archives这个表里所有不在dede_addonarticle里的记录(因为之前我已经删除了前一个表里内容为空的文章了).
——————————————————————————–
select *
from dede_archives
where
NOT EXISTS
(select aid
from dede_addonarticle
where dede_archives.id!=dede_addonarticle.aid)

——————————————————————————–

结果怎么也运行不了.试了好多次,也问了同学,都说语句没问题啊就是显示不了.后来,突然想到,原来MYSQL4.0.28之前的版本不支持嵌套查询.狂晕.还好,还有另一种方法,那就是join.如下:
——————————————————————————–
select *
from dede_archives t1
left join dede_addonarticle t2 on t1.id=t2.aid
where t2.aid is null

——————————————————————————–
结果显示正确,正是我刚刚删除的那些记录.于是狂击键盘,输入以下代码,运行,马上成功:)

——————————————————————————–

DELETE dede_archives t1

from dede_archives t1
left join dede_addonarticle t2 on t1.id=t2.aid
where t2.aid is null

——————————————————————————–

重新生成静态网页,搞定,收功.

总结一下:
第一点: 织梦DEDECMS(版本名称:DedeCms OX 版本号:4_0RC1 ),它的文章是分别存储在两个表里面([dede_addonarticle],[dede_archives]),通过dede_addonarticle.aid与dede_archives.id关联,删除文章时,应该删除两个表里的记录.
第二点: 本次手动删除内容为空或者字数少于30的文章,分了两步分别删除两个表,总结代码如下:
1: 查询查看要删除的文章情况的代码:
select * from dede_addonarticle where length(body)<30
2: 删除内容表.
delete from dede_addonarticle where length(body)<30
3: 查询查看要删除的文章情况的第二个表的代码:
select *
from dede_archives t1
left join dede_addonarticle t2 on t1.id=t2.aid
where t2.aid is null
4: 删除第二个表.
DELETE dede_archives t1
from dede_archives t1
left join dede_addonarticle t2 on t1.id=t2.aid
where t2.aid is null

如果你不查看的话,直接执行第2,4步就可以了 .

发表评论