mysql数据库中随机抽取该分类下的几条数据怎么写?

我想做成那种点击“换一批”按钮后,页面刷新,随即又读出几条文章标题的效果,我的文章表里是按照classid区分类别的,尝试以下的写法,结果读取不出来:$max=$AR->... 我想做成那种点击“换一批”按钮后,页面刷新,随即又读出几条文章标题的效果,我的文章表里是按照classid区分类别的,尝试以下的写法,结果读取不出来:
$max = $AR->where(array('classid' => 7))->count(); // 计算该类文章总数
$limit = "mt_rand(0, $max),$max";
$con = $AR->where(array('classid' => 7))->limit($limit)->select();
求高人指点,谢谢了
展开
 我来答
匿名用户
2013-07-21
展开全部

我这里给你一个  类似的例子,   表结构也就是简单的   分类,  明细.

要查询每个分类下面,   随机明细  几条的情况.

你可以参考参考.

测试表与测试数据。

CREATE TABLE test_order_by_rand (group_code varchar(10), name varchar(10));

INSERT INTO test_order_by_rand VALUES('水果', '苹果');
INSERT INTO test_order_by_rand VALUES('水果', '梨子');
INSERT INTO test_order_by_rand VALUES('水果', '香蕉');
INSERT INTO test_order_by_rand VALUES('水果', '桃子');
INSERT INTO test_order_by_rand VALUES('水果', '菠萝');

INSERT INTO test_order_by_rand VALUES('蔬菜', '萝卜');
INSERT INTO test_order_by_rand VALUES('蔬菜', '白菜');
INSERT INTO test_order_by_rand VALUES('蔬菜', '蘑菇');
INSERT INTO test_order_by_rand VALUES('蔬菜', '毛豆');
INSERT INTO test_order_by_rand VALUES('蔬菜', '青椒');

INSERT INTO test_order_by_rand VALUES('坚果', '核桃');
INSERT INTO test_order_by_rand VALUES('坚果', '榛子');
INSERT INTO test_order_by_rand VALUES('坚果', '杏仁');
INSERT INTO test_order_by_rand VALUES('坚果', '花生');
INSERT INTO test_order_by_rand VALUES('坚果', '开心果');


预期目标, 按照 group_code 进行分组, 每个分组内, 进行随机获取数据.

 

SELECT
  group_code,
  name
FROM
(
SELECT
  CASE 
    WHEN @cn != group_code THEN @rownum:= 1 
    ELSE @rownum:= @rownum + 1  
    END AS No,
  group_code,
  @cn := group_code AS group_code,
  name
FROM
  (SELECT @rownum:=0) r,
  (SELECT @cn:= '') p,
  (SELECT * FROM test_order_by_rand order by group_code, rand()) tmp
)  subQuery
WHERE
  No <= 3
ORDER BY
  group_code;
  
  

这里套了2层子查询, 其中的
(SELECT * FROM test_order_by_rand order by group_code, rand()) tmp  
用于实现, 针对每一个  group_code 进行分组, 下属的 name 的数据, 进行随机排序




其中的
(......)  subQuery
用于实现, 针对 前面的 按 group_code 分组, name 随机排序后的数据。
模拟一个  row_number() over(partition by group_code) 的处理




最后的 No <= 3 用于限制, 每一个 group_code 下面, 显示多少行.






执行结果:
+------------+--------+
| group_code | name   |
+------------+--------+
| 水果       | 苹果   |
| 水果       | 香蕉   |
| 水果       | 梨子   |
| 蔬菜       | 青椒   |
| 蔬菜       | 白菜   |
| 蔬菜       | 蘑菇   |
| 坚果       | 核桃   |
| 坚果       | 花生   |
| 坚果       | 开心果 |
+------------+--------+
9 rows in set (0.00 sec)
鬼知晓
2013-07-21 · TA获得超过278个赞
知道小有建树答主
回答量:340
采纳率:90%
帮助的人:113万
展开全部
那个个分页效果,这样你点击换一批,数据不会重复的!你要是随机抽取的,可能会重复!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
javacowboy
2018-04-27 · TA获得超过117个赞
知道答主
回答量:153
采纳率:0%
帮助的人:39.1万
引用wangzhiqing999的回答:
我这里给你一个 类似的例子, 表结构也就是简单的 分类, 明细.
要查询每个分类下面, 随机明细 几条的情况.
你可以参考参考.
测试表与测试数据。CREATE TABLE test_order_by_rand (group_code varchar(10), name varchar(10));INSERT INTO test_order_by_rand VALUES('水果', '苹果');INSERT INTO test_order_by_rand VALUES('水果', '梨子');INSERT INTO test_order_by_rand VALUES('水果', '香蕉');INSERT INTO test_order_by_rand VALUES('水果', '桃子');INSERT INTO test_order_by_rand VALUES('水果', '菠萝');INSERT INTO test_order_by_rand VALUES('蔬菜', '萝卜');INSERT INTO test_order_by_rand VALUES('蔬菜', '白菜');INSERT INTO test_order_by_rand VALUES('蔬菜', '蘑菇');INSERT INTO test_order_by_rand VALUES('蔬菜', '毛豆');INSERT INTO test_order_by_rand VALUES('蔬菜', '青椒');INSERT INTO test_order_by_rand VALUES('坚果', '核桃');INSERT INTO test_order_by_rand VALUES('坚果', '榛子');INSERT INTO test_order_by_rand VALUES('坚果', '杏仁');INSERT INTO test_order_by_rand VALUES('坚果', '花生');INSERT INTO test_order_by_rand VALUES('坚果', '开心果');预期目标, 按照 group_code 进行分组, 每个分组内, 进行随机获取数据.
SELECT group_code, nameFROM(SELECT CASE WHEN @cn != group_code THEN @rownum:= 1 ELSE @rownum:= @rownum + 1 END AS No, group_code, @cn := group_code AS group_code, nameFROM (SELECT @rownum:=0) r, (SELECT @cn:= '') p, (SELECT * FROM test_order_by_rand order by group_code, rand()) tmp) subQueryWHERE No <= 3ORDER BY group_code; 这里套了2层子查询, 其中的(SELECT * FROM test_order_by_rand order by group_code, rand()) tmp 用于实现, 针对每一个 group_code 进行分组, 下属的 name 的数据, 进行随机排序其中的(......) subQuery用于实现, 针对 前面的 按 group_code 分组, name 随机排序后的数据。模拟一个 row_number() over(partition by group_code) 的处理最后的 No <= 3 用于限制, 每一个 group_code 下面, 显示多少行.执行结果:+------------+--------+| group_code | name |+------------+--------+| 水果 | 苹果 || 水果 | 香蕉 || 水果 | 梨子 || 蔬菜 | 青椒 || 蔬菜 | 白菜 || 蔬菜 | 蘑菇 || 坚果 | 核桃 || 坚果 | 花生 || 坚果 | 开心果 |+------------+--------+9 rows in set (0.00 sec)
展开全部
SELECT
group_code,
`name`
FROM
(
SELECT
CASE
WHEN @cn != group_code THEN @rownum:= 1
ELSE @rownum:= @rownum + 1
END AS No,
group_code,
@cn := group_code AS group_code1,
name
FROM
(SELECT @rownum:=0) r,
(SELECT @cn:= '') p,
(SELECT * FROM test_order_by_rand order by group_code, rand()) tmp
) subQuery
WHERE
`No` <= 3
ORDER BY
group_code;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式