2011-07-17 13 views
2

ORDER BY RAND() query mysqlを使用します。しかし、私はいくつか質問したい。ORDER BY RAND()in

のように私のmysqlのテーブル '画像':私は、MySQLのクエリORDER BY RAND()印刷5 imagesを行う必要がある

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 | 

、受注は以下のとおりです。

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

まあ、私が正しくあなたの質問を理解する場合は、各句が正しい制約を持つfirstsecondthirdを置き換えるには

(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) 

のような何かをしたい...

+1

OPが求めている(あまりにも複雑な)ものではありませんが、まだ私の+1を得ています –

+0

UNION同じテーブル、重複した結果を削除する、それは単なる方法です。これは私が考えなかったものです。ありがとう。 –

1

複数の異なる値で注文することができます。

あなたは偽よりも高い値として扱われ、真のブール式の結果によって、偶数次(そうDESCはあなたの本当の最初を与えます。)することができます

あなただけBY句各ORDERの間にコンマを置きます。

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

幸運:

はここにあなたの一例です。

+0

'LIMIT'のことをどうやって制御するのですか? '(幅> = 729と高さ> 560)LIMIT 1'、(幅>高さ)LIMIT 2'、(幅= 640)LIMIT 2'の場合は? –

+0

RIM()の後の最後にLIMIT 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