2012-12-14 40 views
6

我在MySQL中有一個包含列名稱category的表格。 我想寫一個查詢,將返回從每個category 2個隨機記錄。從MySQL中的每個'group by'類別檢索任意數量的隨機行

這裏是我用來獲取每個category最高值2個記錄在我的rating列代碼:

SELECT e1.* 
FROM entries AS e1 
WHERE (SELECT Count(*) 
     FROM entries AS e2 
     WHERE e2.category = e1.category 
       AND e1.rating <= e2.rating) <= 2 
ORDER BY category, 
      rating DESC 

檢查這個環節出去看一個表,一些樣本數據和上面的查詢: http://sqlfiddle.com/#!9/bab8e/1

+1

你究竟需要什麼......每個類別的隨機記錄對?或者什麼,這是否涉及查詢你包括..!? – Chella

+0

該查詢只是爲了顯示我正在處理的內容,例如我在每個類別的表10中有30個條目,我想檢索這些類別中的每個類別的2個隨機條目。這將返回6個結果。 – Ivar

+0

看看這篇文章:http://stackoverflow.com/questions/984396/how-to-get-mysql-random-integer-range – ntgCleaner

回答

1

我通過按類別列和隨機數對錶格進行排序,從而達到了預期效果。然後,我在每次改變類別時爲每一行重新分配一個遞增數字。然後,我只返回rowNum小於或等於2的結果。如果要返回3個隨機行,則只需將其更改爲小於或等於3,依此類推。

SELECT entry_id, 
     category, 
     rating 
FROM (SELECT @currank := IF(@category = category, @currank + 1, 1) AS rowNum, 
       @category := category         AS categoryVar, 
       e1.* 
     FROM (SELECT *, 
         (SELECT @currank := 0) r 
       FROM entries 
       ORDER BY category, 
          Rand()) AS e1)AS e2 
WHERE rownum <= 2 
ORDER BY category, 
      rating; 

這裏就像是你在你的問題發佈了一個一個sqlfiddle鏈接: http://sqlfiddle.com/#!9/bab8e/37/0


請注意,這個相同的查詢可以很容易地進行調整,以退回沒有記錄一組號碼隨機。例如,如果你想從每個category返回前5 rating是你可以改變

ORDER BY category,rand()

ORDER BY category, rating DESC

和改變

WHERE rownum <= 2

WHERE rownum <= 5