dede sql 随机调用

99ANYc3cd6
预计阅读时长 13 分钟
位置: 首页 DEDE建站 正文

核心方法:使用 ORDER BY RAND()

这是实现随机排序最核心、最直接的方法,在SQL查询语句中,在排序字段后加上 RAND() 函数,就可以让结果集随机排序。

dede sql 随机调用
(图片来源网络,侵删)

基本语法

SELECT * FROM `dede_archives` ORDER BY RAND() LIMIT 数量;
  • dede_archives: 这是DedeCMS中存储文章核心数据的表,如果你的表前缀不是 dede_,请自行替换。
  • ORDER BY RAND(): 关键部分,表示对查询结果进行随机排序。
  • LIMIT 数量: 限制返回的记录数,LIMIT 10 表示只返回10条随机记录。

随机调用指定栏目ID的文章

这是最常用的场景,比如在首页随机调用“产品中心”栏目的5篇文章。

SQL语句

SELECT id, title, litpic, description
FROM `dede_archives`
WHERE typeid IN (栏目ID1, 栏目ID2, ...)  -- 替换成你的目标栏目ID
AND arcrank >= 0  -- 可选,排除草稿等
ORDER BY RAND()
LIMIT 5;  -- 调用5条

详细说明

  • SELECT id, title, litpic, description: 选择你需要的字段。id是文章ID,titlelitpic是缩略图,description是描述(,你也可以使用 来获取所有字段,但不推荐,因为它会消耗更多资源。
  • WHERE typeid IN (栏目ID1, 栏目ID2, ...): 这是筛选条件。typeid 字段存储的是文章所属的栏目ID,你可以传入一个或多个栏目ID,用逗号隔开。
  • arcrank >= 0: 这是一个很好的实践。arcrank 字段用于标识文章状态,-1 通常表示草稿或未审核,0 或正数表示已发布,加上这个条件可以避免调用到未发布的文章。
  • LIMIT 5: 最终只返回5条随机记录。

完整调用示例 (在首页模板 index.htm 中)

{dede:sql sql='SELECT id, title, litpic, description FROM `dede_archives` WHERE typeid IN (5,6,7) AND arcrank >= 0 ORDER BY RAND() LIMIT 5'}
    <li>
        <a href='[field:arcurl/]' title="[field:title/]">
            <img src='[field:litpic/]' alt="[field:title/]">
            <h3>[field:title/]</h3>
            <p>[field:description function='cn_substr(@me, 100)'/]</p> <!-- 截取100个字符作为摘要 -->
        </a>
    </li>
{/dede:sql}

随机调用带图或有特定属性的文章

有时候我们希望随机调用的文章必须满足更多条件,比如必须有缩略图,或者属于特定专题等。

SQL语句

SELECT id, title, litpic, description
FROM `dede_archives`
WHERE typeid IN (5, 6, 7)
AND arcrank >= 0
AND litpic != ''  -- 筛选出有缩略图的文章
AND flag like '%p%'  -- 筛选出带有“图片”属性的文章(p代表picture)
ORDER BY RAND()
LIMIT 5;

详细说明

  • AND litpic != '': litpic 字段如果为空,表示文章没有上传缩略图,这个条件确保调用的每篇文章都有缩略图。
  • AND flag like '%p%': flag 字段用于存储文章的属性,c 代表“推荐”,h 代表“头条”,p 代表“图片”。like '%p%' 是一个模糊匹配,只要属性中包含 p 就会被选中,你可以根据需要修改,flag like '%c%' 来调用推荐文章。

随机调用指定时间范围内的文章

我们想随机调用最近30天内发布的文章。

SQL语句

SELECT id, title, litpic, description
FROM `dede_archives`
WHERE typeid IN (5, 6, 7)
AND arcrank >= 0
AND senddate >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 30 DAY))  -- 30天内
ORDER BY RAND()
LIMIT 5;

详细说明

  • senddate: 这是文章的发布时间戳字段(Unix时间戳)。
  • UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 30 DAY)): 这是一个MySQL函数,用于计算出30天前那一天的0点0分0秒对应的时间戳。
    • CURDATE(): 获取当前日期。
    • DATE_SUB(..., INTERVAL 30 DAY): 从当前日期减去30天。
    • UNIX_TIMESTAMP(...): 将这个日期转换成时间戳。

性能优化与注意事项

ORDER BY RAND() 虽然方便,但在数据量大的情况下(例如超过10万条记录),它的性能会急剧下降,因为它需要对整个结果集进行随机排序,非常消耗CPU和内存。

dede sql 随机调用
(图片来源网络,侵删)

优化方案:使用 JOINRAND() 子查询

当数据量很大时,可以采用一种更高效的策略:先随机抽取ID,再根据ID查询。

SQL语句 (优化版)

SELECT a.id, a.title, a.litpic, a.description
FROM `dede_archives` a
JOIN (
    SELECT id FROM `dede_archives`
    WHERE typeid IN (5, 6, 7) AND arcrank >= 0
    ORDER BY RAND()
    LIMIT 5
) b ON a.id = b.id;

原理

  1. 子查询 : 内部的查询 SELECT id FROM ... ORDER BY RAND() LIMIT 5 只负责从所有符合条件的文章中,随机抽取5个文章的ID,这个操作的数据量很小,所以速度很快。
  2. 主查询 JOIN: 外部的查询则只根据这5个随机ID,去 dede_archives 表中查找完整的文章信息,由于ID是主键,通过ID查询的速度是极快的。

这种方法在数据量大的情况下,性能远优于直接对全表使用 ORDER BY RAND()

场景 SQL核心逻辑 适用情况
基础随机调用 SELECT ... FROM ... ORDER BY RAND() LIMIT N 数据量小(几万条以内),简单随机调用。
按栏目随机 WHERE typeid IN (ID1, ID2) 最常用,限定栏目范围。
按属性随机 AND flag like '%p%' 筛选有特定属性(如图文、推荐)的文章。
按时间随机 AND senddate >= UNIX_TIMESTAMP(...) 调用最近发布的内容。
性能优化版 JOIN (SELECT id ... ORDER BY RAND() LIMIT N) ON a.id=b.id 数据量大时(10万+)必须使用,性能最佳。

希望这份详细的指南能帮助你在DedeCMS项目中灵活地实现随机调用功能!

dede sql 随机调用
(图片来源网络,侵删)
-- 展开阅读全文 --
头像
织梦留言板模块在哪里?
« 上一篇 昨天
C语言程序设计第三版谭浩强核心内容是什么?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

目录[+]