【问题标题】:MYSQL select random of each of the categoriesMYSQL 随机选择每个类别
【发布时间】:2013-05-18 16:38:24
【问题描述】:

我想从同一张表的每个类别中随机选择 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

我曾尝试在子查询中使用限制,但出现错误:此版本的 MySQL 尚不支持 'LIMIT & IN/ALL/ANY/SOME 子查询

请问有什么方法可以解决吗?谢谢。

【问题讨论】:

  • 向我们展示您到目前为止所尝试的内容(即您所指的查询)。
  • SELECT * FROM (SELECT * FROM t_shop ORDER BY RAND()) AS T GROUP BY shop_CategoryID ORDER BY shop_CategoryID
  • SELECT * FROM t_shop sod WHERE shop_categoryID IN (SELECT shop_categoryID FROM t_shop WHERE shop_id = sod.shop_id ORDER BY shop_categoryID limit 5)

标签: mysql random


【解决方案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)

【讨论】:

  • @KC 。 . .您可以为每个类别添加额外的子查询。
【解决方案2】:
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 开始。

【讨论】:

  • 谢谢你的回复,我想问一下,为什么同一个categoryID会有好几个相同的'rownum'值?
  • 就这样..s16.postimg.org/f6r8hzj5x/image.png#我每个类别都有5条以上的记录,这就是为什么我想随机获得5条记录...
  • 很抱歉,我也在测试很多行,但我无法重现该问题或思考它是如何发生的。
  • 我现在正尝试使用 'group by rownum, shop_categoryID' 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
猜你喜欢
  • 1970-01-01
  • 2012-12-24
  • 2012-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-23
相关资源
最近更新 更多