2012-09-01 88 views
3

中隨機我有一個表,它看起來像:選擇兩種不同的每個類別與MySQL

table: Q 
--------------------------- 
|question| scope | type | 
--------------------------- 
| this | A | 1 | 
| that | A | 1 | 
| them | A | 1 | 
--------------------------- 
| this | A | 2 | 
| that | A | 2 | 
| them | A | 2 | 
--------------------------- 
| this | B | 1 | 
| that | B | 1 | 
| them | B | 1 | 
--------------------------- 

我需要賦予了範圍,我需要從每一類中提取兩個條目。如果範圍A,一個可能的解決方案可能是:

--------------------------- 
| this | A | 1 | 
| them | A | 1 | 
--------------------------- 
| that | A | 2 | 
| this | A | 2 | 
--------------------------- 
我目前使用下面的SQL語句

SELECT tmp.question, tmp.type, tmp.scope 
FROM Q 
LEFT JOIN (
SELECT * FROM Q ORDER BY RAND() 
)tmp ON (Q.type = tmp.type AND tmp.scope = 'A') 
GROUP BY tmp.type 
ORDER BY Q.type 

然而,這只是返回每個類型出於某種原因,一個NULL行一個條目。
因此,我的問題是如何優化語句來返回兩行並消除NULL?

+0

我會問你編輯你的問題。我認爲你要求*兩個*,*不同*,*隨機選擇*,來自每個不同'類型'的條目。正確? –

+0

是啊那是正確的! –

回答

2

你可以從2改變排名,無論你想爲每個類別。

http://www.sqlfiddle.com/#!2/f3946/86

試試這個:

SELECT x.question, 
     x.scope, 
     x.type 
    FROM (

    SELECT bp.question, bp.scope, bp.type, 
    CASE WHEN bp.type = @type 
     THEN @rownum := @rownum + 1 
     ELSE @rownum := 1 
     END AS rank, 
    @type := bp.type 
FROM (select * from Q order by rand()) bp 
JOIN (SELECT @rownum := 0, @type := NULL) r 
WHERE bp.scope = 'A' 
ORDER BY type 
    ) x 
WHERE x.rank <= 2 
order by x.type 

注:我使用了舊的答案和隨機提高。 舊的回答我得到的幫助是: Select N records for each category and order by X

+0

哇,這是一個複雜的聲明,但它的招數!非常感謝! –

0

SqlFiddle

(
    SELECT question, scope, type FROM Q 
    WHERE scope = 'A' AND type = 1 
    ORDER BY RAND() LIMIT 2 
) 
UNION 
(
    SELECT question, scope, type FROM Q 
    WHERE scope = 'A' AND type = 2 
    ORDER BY RAND() LIMIT 2 
) 
+0

這個工程!但是假設類型是已知的.. –

+0

@AndreasJarbol我認爲這是事實。我顯然被誤解了。 – mmdemirbas