MYSQL选择每个类别的随机

时间:2013-05-18 16:38:24

标签: mysql random

我想从同一张表中的每个类别中随机选择5条记录。

表名:t_shop

列名:shop_id,shop_categoryID

例如: shop_id | shop_categoryID

1 | 1
2 | 1
5 | 1
7 | 1
9 | 1
10| 1
13| 2
15| 2
22| 2
23| 2
25| 2

我已尝试在子查询中使用limit,但发生错误:此版本的MySQL尚不支持'LIMIT& IN / ALL / ANY / SOME子查询

我想问一下有什么方法可以解决吗?感谢。

2 个答案:

答案 0 :(得分:1)

如果您有两个类别(如您的问题),MySQL中最简单的方法是使用union all

(select * from t_shop where category = 1 order by rand() limit 5)
union all
(select * from t_shop where category = 2 order by rand() limit 5)

答案 1 :(得分:1)

SELECT STRAIGHT_JOIN t.* 
FROM (SELECT @r:=0, @c:= null) AS rownum_init,
   (SELECT *, (@r:=IF(@c=shop_categoryID, @r+1, 1)) AS rownum, (@c:=shop_categoryID) 
    FROM t_shop
    ORDER BY shop_categoryID, RAND()) AS t
WHERE t.rownum <= 5;

这是我在MySQL 5.5.30测试中的输出,使用您的测试数据:

+---------+-----------------+--------+-----------------------+
| shop_id | shop_categoryID | rownum | (@c:=shop_categoryID) |
+---------+-----------------+--------+-----------------------+
|       5 |               1 |      3 |                     1 |
|       1 |               1 |      1 |                     1 |
|       9 |               1 |      5 |                     1 |
|       2 |               1 |      2 |                     1 |
|       7 |               1 |      4 |                     1 |
|      22 |               2 |      3 |                     2 |
|      23 |               2 |      4 |                     2 |
|      25 |               2 |      5 |                     2 |
|      13 |               2 |      1 |                     2 |
|      15 |               2 |      2 |                     2 |
+---------+-----------------+--------+-----------------------+

通常关于涉及ORDER BY ... RAND()的任何解决方案的建议是它不可扩展,并且随着表的大小增长而变得更加昂贵。但是对于像你描述的那样复杂的随机选择问题,它可能是解决问题的唯一方法。如果表现不佳,请不要感到惊讶。


重新评论:

我不明白你的意思。 Rownum在每个类别中都有一个从1开始的独特值,然后在类别更改时从1开始。