2014-03-29 56 views
0

我想運行這樣的查詢,所以我總是會得到20個結果,即使第一SELECT聲明沒有足夠的數據來恢復10結果。使用ORDER BY RAND()在MySQL聯合查詢與獨立限陳述

(
SELECT t.column1, t.column2 
FROM table t 
WHERE t.status = 1 
LIMIT 10 
) 
UNION 
(
SELECT t.column1, t.column2 
FROM table t 
WHERE t.status = 2 
LIMIT 20 
) 
LIMIT 20 

但我則想ORDER BY RAND(),並確保從第一SELECT聲明所有可用的結果包含在最終結果集。

當我將ORDER BY RAND()添加到此查詢的末尾時,它給我的結果集不包括來自第一個SELECT的全部10個結果,我假設它是真正獲得30行,然後從30個隨機中選擇20個。

任何想法,將不勝感激。

這裏是爲我工作:

SELECT x.* 
FROM ((
SELECT t.column1, t.column2 
FROM table t 
WHERE t.status = 1 
LIMIT 10 
) 
UNION 
(
SELECT t.column1, t.column2 
FROM table t 
WHERE t.status = 2 
LIMIT 20 
) 
LIMIT 20) x 
ORDER BY RAND 

回答

2

如果您訂購由什麼選擇他們是「從」第一,應用限前20名的UNION結果應該工作:

SELECT … FROM 
(
    (
    SELECT t.column1, t.column2, 0 AS ordervalue FROM … WHERE … 
    LIMIT 10 
) 
    UNION 
    (
    SELECT t.column1, t.column2, 1 FROM … WHERE … 
    LIMIT 20 
) 
    ORDER BY ordervalue ASC# this will make the values from your first SELECT come 
          # first, then the ones from the second 

    LIMIT 20 # of those ordered values, the first 20 are taken 
) 
ORDER BY RAND() 

我介紹了一個靜態值作爲ordervalue在這裏 - 在你的特殊情況下,它不會是必要的,因爲你通過status 1或2個選擇,這樣你就可以通過該值直接訂購。但如果不是這樣(或狀態值會有所不同),即「僞」列的值將是要走的路。

+0

我覺得對我來說是在增加一個組周圍的一切外parentheis並把ORDER BY RAND()鍵快結束的時候選擇((SELECT ...)UNION(SELECT ...))令BY RAND – Chris