MySQL从表中随机选取一列

设我当前有这样一个表,包含一个自增长的id列,一个content列保存内容。我想要从这张表中随机选取1条内容,可能还要将type作为过滤条件。

CREATE TABLE `random_select` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `content` varchar(1024) COLLATE utf8mb4_unicode_ci NOT NULL,
  `type` varchar(35) COLLATE utf8mb4_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=78 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

以下方法后的时间都为本地mysql的测试平均运行时间,表内包含数据条

最简单粗暴的方法:

但这样的写法不被推荐。 在 ORDER BY 使用 RAND() 函数会导致数据列被多次扫描,导致效率相当低。

SELECT * FROM random_select where type='anytype' ORDER BY RAND() LIMIT 1;

使用join的方法:

SELECT * FROM random_select AS t1 JOIN (
	SELECT ROUND(RAND()*(SELECT MAX(id) FROM random_select where type='anytype')
) AS id) AS t2 
WHERE t1.id>=t2.id and type='anytype'
ORDER BY t1.id
LIMIT 1;

更优的方法,使用子查询

SELECT * FROM random_select WHERE type='anytype' and id>= (
	(SELECT MAX(id) FROM random_select WHERE type='anytype' )
	-
	(SELECT MIN(id) FROM random_select WHERE type='anytype' )
) * RAND() 
+(SELECT MIN(id) FROM random_select WHERE type='anytype' ) 
LIMIT 1

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值