ЗАКАЗАТЬ ПО RAND () в MySQL - PullRequest
2 голосов
/ 18 июля 2011

Я хочу использовать ORDER BY RAND() запрос mysql.Но у меня есть вопрос, который я хочу задать.

моя таблица mysql 'image' вроде:

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() print 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 изображений не повторяются.Мой разум сейчас сбит с толку, нужна помощь.

Ответы [ 3 ]

5 голосов
/ 18 июля 2011

Ну, если я правильно понимаю ваш вопрос, вы хотите сделать что-то вроде

(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 замените first, second и third с правильными ограничениями ...

2 голосов
/ 18 июля 2011
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
1 голос
/ 18 июля 2011

Вы можете заказать несколько различных значений.

Вы можете даже упорядочить по результату логического выражения, где true рассматривается как более высокое значение, чем false (поэтому DESC сначала дает вам true).

Вы просто ставите запятую между каждым предложением ORDER BY.

Вот ваш пример:

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

Удачи.

...