我想从同一张表中的每个类别中随机选择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子查询
我想问一下有什么方法可以解决吗?感谢。
答案 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开始。