核心思路
DedeCMS 的文章内容主要存储在 dede_archives (文章主表) 和 dede_addonarticle (文章附加表,根据模型不同可能为 dede_addonother 等) 这两张表中。

(图片来源网络,侵删)
dede_archives: 存储文章的基本信息,如标题 (title)、作者 (author)、发布时间 (pubdate) 等。dede_addonarticle: 存储文章的正文内容 (body)。
要查询文章内容中的关键词,我们需要对 dede_addonarticle 表的 body 字段进行操作。
使用 LIKE 进行模糊查询 (最常用)
这是最基础、最直接的查询方法,可以找出所有包含指定关键词的文章。
查询包含单个关键词的文章
假设我们要查询所有文章内容中包含 "织梦" 这个关键词的文章,并显示标题和内容摘要。
SELECT
a.id,
a.title,
a.pubdate,
LEFT(b.body, 200) AS body_summary
FROM
dede_archives AS a
JOIN
dede_addonarticle AS b ON a.id = b.aid
WHERE
b.body LIKE '%织梦%'
ORDER BY
a.pubdate DESC;
SQL 语句详解:

(图片来源网络,侵删)
SELECT a.id, a.title, ...: 选择我们需要的字段,a.id是文章ID,a.title是文章标题。LEFT(b.body, 200) AS body_summary: 从文章正文中截取前 200 个字符作为摘要,方便预览。FROM dede_archives AS a JOIN dede_addonarticle AS b ON a.id = b.aid: 将文章主表和附加表通过文章ID (id/aid) 关联起来。WHERE b.body LIKE '%织梦%': 这是核心条件。LIKE用于模糊匹配。- 是通配符,代表任意数量的任意字符(包括零个)。
%织梦%表示“文本中任意位置包含 '织梦' 这两个连续字符”。
ORDER BY a.pubdate DESC: 按发布时间降序排列,最新的文章排在前面。
查询包含多个关键词(AND/OR关系)的文章
-
查询同时包含 "PHP" 和 "MySQL" 的文章 (AND 关系)
SELECT a.id, a.title FROM dede_archives AS a JOIN dede_addonarticle AS b ON a.id = b.aid WHERE b.body LIKE '%PHP%' AND b.body LIKE '%MySQL%' ORDER BY a.id DESC; -
查询包含 "Java" 或 "Python" 的文章 (OR 关系)
SELECT a.id, a.title FROM dede_archives AS a JOIN dede_addonarticle AS b ON a.id = b.aid WHERE b.body LIKE '%Java%' OR b.body LIKE '%Python%' ORDER BY a.id DESC;
使用 REGEXP 进行正则表达式查询 (更强大)
如果你的查询需求更复杂,比如要匹配特定格式的关键词,正则表达式是更好的选择。
查询包含 "DedeCMS" 或 "织梦CMS" 的文章
SELECT
a.id,
a.title
FROM
dede_archives AS a
JOIN
dede_addonarticle AS b ON a.id = b.aid
WHERE
b.body REGEXP 'DedeCMS|织梦CMS'
ORDER BY
a.id DESC;
SQL 语句详解:

(图片来源网络,侵删)
REGEXP 'DedeCMS|织梦CMS': 使用正则表达式进行匹配。- 是正则表达式中的 "OR" 操作符。
- 这句代码的含义是:查找内容中包含 "DedeCMS" 或者 "织梦CMS" 的记录。
查找特定格式的邮箱地址
查找文章中是否包含 @dedecms.com 结尾的邮箱。
SELECT
a.id,
a.title
FROM
dede_archives AS a
JOIN
dede_addonarticle AS b ON a.id = b.aid
WHERE
b.body REGEXP '[a-zA-Z0-9._%+-]+@dedecms\.com'
ORDER BY
a.id DESC;
结合 CONCAT 搜索标题和内容
我们需要同时搜索文章标题和内容,这样可以找到更相关的结果。
SELECT
a.id,
a.title,
LEFT(b.body, 200) AS body_summary
FROM
dede_archives AS a
JOIN
dede_addonarticle AS b ON a.id = b.aid
WHERE
CONCAT(a.title, ' ', b.body) LIKE '%织梦模板%'
ORDER BY
a.pubdate DESC;
SQL 语句详解:
CONCAT(a.title, ' ', b.body): 将文章的title和body字段连接成一个大的字符串,中间用空格隔开,避免词语粘连。LIKE '%织梦模板%': 现在是在这个连接后的完整字符串中进行搜索,只要标题或内容中任意一部分包含 "织梦模板" 就会被匹配到。
重要注意事项
-
表前缀
dede_: 你的数据库表前缀可能不是dede_,而是在安装时自定义的(如cms_),请务必将 SQL 语句中的dede_替换为你自己的表前缀。 -
文章模型与附加表:
- 默认的文章模型使用
dede_addonarticle。 - 如果你使用了其他自定义模型(例如图集模型、产品模型等),附加表的名称会不同,可能是
dede_addonother或其他,你需要根据实际情况修改JOIN的表名。
- 默认的文章模型使用
-
性能问题:
LIKE '%关键词%'是全表扫描,当文章数量非常多时(比如超过10万篇),查询速度会非常慢,甚至可能导致服务器卡顿。- 解决方案: 对于生产环境和频繁的查询,强烈建议使用 MySQL 全文索引,但这需要修改表结构,对现有数据有一定影响,适合在网站初期或数据量不大时进行规划。
-
执行环境:
- 你可以在 DedeCMS 后台的 系统 -> SQL命令行工具 中执行这些 SQL 语句。
- 也可以使用 phpMyAdmin 等数据库管理工具直接在数据库中执行。
| 查询需求 | SQL 关键部分 | 适用场景 |
|---|---|---|
| 包含单个关键词 | WHERE body LIKE '%关键词%' |
最常见、最简单的需求。 |
| 包含多个关键词 (AND) | WHERE body LIKE '%A%' AND body LIKE '%B%' |
需要同时满足多个条件。 |
| 包含多个关键词 (OR) | WHERE body LIKE '%A%' OR body LIKE '%B%' |
满足其中任意一个条件即可。 |
| 复杂模式匹配 | WHERE body REGEXP '正则表达式' |
需要匹配特定格式,如邮箱、手机号。 |
| 和内容 | WHERE CONCAT(title, ' ', body) LIKE '%关键词%' |
扩大搜索范围,提高查全率。 |
选择哪种方法取决于你的具体需求,对于日常使用,方法一(LIKE) 已经足够强大和灵活。
