STEEM SQL 系列之 随机返回是怎么实现的?


mssql STEEM SQL 系列之 随机返回是怎么实现的? I.T. SteemIt 数据库

MSSQL Database

比如你看到这样的 帖子 “随机挑选几个帖子” 或者 “随机挑选几个回复”, 你是不是在想, 这怎么弄的? 其实不难, 我们先来看第一个版本:

1
2
3
4
5
6
7
8
9
10
SELECT TOP 10 
    author, body
FROM
    Comments (NOLOCK)
WHERE
    FORMAT(created,'MM-dd','en-us') = FORMAT(GETUTCDATE(),'MM-dd','en-us')
    AND YEAR(created) <> YEAR(GETUTCDATE())
    AND depth = 0
ORDER BY
    NEWID()
SELECT TOP 10 
    author, body
FROM
    Comments (NOLOCK)
WHERE
    FORMAT(created,'MM-dd','en-us') = FORMAT(GETUTCDATE(),'MM-dd','en-us')
    AND YEAR(created) <> YEAR(GETUTCDATE())
    AND depth = 0
ORDER BY
    NEWID()

说明:

  • 尽可能只选择你需要的字段而不是返回所有 select *
  • 在表后面加上(NOLOCK) 能避免数据库正在更新的时候锁定查询.
  • 使用GetUTCDate() 日期时间函数因为在STEEMSQL上所有时间都是UTC.
  • 使用 depth = 0来限制文章, 相反使用depth > 0来查询所有的评论
  • ORDER BY NEWID() 能根据随机ID来排序, 所以很慢, 因为需要查找所有的记录然后再排序.

我们还可以限制类别, 比如 “cn” 类目随机挑选……

1
category = "cn"
category = "cn"

效率较高的方法是在在WHERE限制语句中加上以下判断:

1
AND (ABS(CAST( (BINARY_CHECKSUM(ID, NEWID())) as int)) % 100) < 50
AND (ABS(CAST( (BINARY_CHECKSUM(ID, NEWID())) as int)) % 100) < 50

BINARY_CHECKSUM 函数用于返回一些字段的较验值, 速度快, 并且不需要查找所有记录也不需要排序就可以了.

当然, 还可以在 PYTHON或PHP中先生成一个随机ID的列表, 然后把这些列表值传入SQL语句中……

你还有什么好的办法? 分享出来, 如果是个很好的(创新)办法, 那么我们奖励你 1 SBD.

英文: SteemSQL Tutorial: How to Get Random Posts on SteemIt?

STEEM SQL 系列教程

GD Star Rating
loading...
本文一共 531 个汉字, 你数一下对不对.
STEEM SQL 系列之 随机返回是怎么实现的?. (AMP 移动加速版本)
上一篇: 剑桥华人迎中秋做月饼活动
下一篇: 说说单点故障 Single Point Failure

扫描二维码,分享本文到微信朋友圈
cfdd768d4df23bb5511f600b81119522 STEEM SQL 系列之 随机返回是怎么实现的? I.T. SteemIt 数据库

2 条评论

评论