2013-05-18 85 views
0

我想從同一個表中的每個類別中選擇隨機5條記錄。MYSQL選擇每個類別的隨機數

表名: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子查詢

我想問一下有什麼方法可以解決?謝謝。

+0

向我們展示您到目前爲止所嘗試的內容(即您所查詢的查詢)。 – gkalpak

+0

SELECT * FROM( \t SELECT * \t FROM t_shop \t ORDER BY RAND() )AS T GROUP BY shop_CategoryID ORDER BY shop_CategoryID –

+0

SELECT * FROM t_shop草皮 WHERE shop_categoryID IN ( SELECT shop_categoryID FROM t_shop WHERE shop_id = sod.shop_id ORDER BY shop_categoryID limit 5 ) –

回答

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) 
+2

哦......我有超過2個類別的表... –

+0

@KC。 。 。您可以爲每個類別添加一個額外的子查詢。 –

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 30年5月5日,使用您的測試數據:

+---------+-----------------+--------+-----------------------+ 
| 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開始。

+0

謝謝你的回覆, 我想問一下,爲什麼有幾個相同的'rownum'值出現在同一個categoryID? –

+0

就像這樣.. http://s16.postimg.org/f6r8hzj5x/image.png# 我有超過5個記錄在每個類別,這就是爲什麼我想隨機獲得五個記錄... –

+0

我'對不起,我也在測試很多行,並且我無法重現那個問題或者想它是如何發生的。 –