2011-07-17 42 views
2

我想用ORDER BY RAND()查詢mysql。但我有一些問題想問。MySQL中的ORDER BY RAND()

我mysql表 '形象',如:

id | image | width | height | 
1 | 1.jpg | 640 | 480 | 
2 | 2.jpg | 800 | 600 | 
3 | 3.jpg | 480 | 600 | 
4 | 4.jpg | 720 | 480 | 
5 | 5.jpg | 600 | 800 | 
6 | 6.jpg | 1024 | 768 | 
7 | 7.jpg | 768 | 1024 | 
8 | 8.jpg | 800 | 600 | 
9 | 9.jpg | 720 | 560 | 
10 | 10.jpg| 800 | 600 | 

我需要做一個MySQL查詢ORDER BY RAND()打印5 images,訂單有:

first: width >= 720 and height >= 560 , 1 image(this may be width < height)

second: width > height, 2 images.(left the first 1 image, do the rest 9 images ORDER BY RAND())

third: width >= 640, 2 images.(left above 3 images, do the rest 7 images ORDER BY RAND())

所有5張圖片都不重複。我的頭腦現在感到困惑,需要幫助。

+2

我閱讀你的描述後,頭腦也會感到困惑。 – Jules

回答

5

好吧,如果我正確地理解你的問題,你想去做

(SELECT image FROM tab WHERE(first) ORDER BY RAND() LIMIT 1) 
UNION 
(SELECT image FROM tab WHERE(second) ORDER BY RAND() LIMIT 2) 
UNION 
(SELECT image FROM tab WHERE(third) ORDER BY RAND() LIMIT 2) 

在每個東西WHERE子句更換firstsecondthird與正確的約束......

+1

不是OP要求的(過於複雜),但仍然讓我的+1 –

+0

UNION成爲同一張表,刪除重複的結果,這是一個正確的方法。這是我沒有想到的。謝謝。 –

1

您可以通過多個不同的值進行訂購。

你甚至可以在那裏真正被視爲比假更高的值的布爾表達式的結果順序(DESC所以給你真正的第一。)

你只要把BY子句每個訂單之間的逗號。

這裏就是你們的榜樣:

select * 
from foo 
ORDER BY 
(width >= 729 AND height > 560) DESC, 
(width > height) DESC, 
(WIDTH >= 640) DESC, 
RAND() 

好運。

+0

那麼如何控制'LIMIT'這個東西?如果'(width> = 729 AND height> 560)LIMIT 1','(width> height)LIMIT 2','(WIDTH> = 640)LIMIT 2'? –

+0

在RAND()之後的最後一個限制2,你不能用if來限制。但是您可以在應用程序的邏輯中定義限制值。 –

2
SELECT id 
FROM 
    ((SELECT MIN(q) AS q,id 
     FROM 
     ((SELECT 1 AS q, id FROM image WHERE(first) ORDER BY RAND() LIMIT 1) 
     UNION ALL 
      (SELECT 2,id FROM image WHERE(second) ORDER BY RAND() LIMIT 3) 
     ) AS tmp2 
     GROUP BY id 
     ORDER BY MIN(q) 
     LIMIT 3 
    ) 
    UNION ALL 
    (SELECT 3, id FROM image WHERE(third) ORDER BY RAND() LIMIT 5) 
) AS tmp3 
GROUP BY id 
ORDER BY MIN(q) 
LIMIT 5