Получить несколько случайных и некоторые конкретные записи в одном запросе? - PullRequest
1 голос
/ 18 января 2011

Итак, у меня есть карусель изображений в стиле Cover-Flow, заполненная запросом типа

SELECT foo FROM `imageTable` ORDER BY RAND() LIMIT 0, 12;

Мой клиент хотел бы добавить к этому набор постоянных изображений.Из-за способа использования результатов было бы очень удобно, если бы я мог сделать эти записи частью моего исходного запроса.

Я пытался

SELECT foo FROM `imageTable` WHERE `id` = 'x' OR `id` = 'y' 
  OR `id` IS NOT NULL ORDER BY RAND() LIMIT 0, 12;

Я надеялся, что записи с идентификаторамиобязательно будет в результирующем наборе, но нет, RAND () тасует весь набор.

Поэтому мой вопрос заключается в том, может ли какой-либо один запрос предоставить x постоянных записей, а затем y случайных записей?

// РЕДАКТИРОВАТЬ С ПЕРЕСМОТРЕННЫМ ЗАПРОСОМ, ИСПОЛЬЗУЯ ответ Адриана Серафина:

(SELECT * FROM `imageTable` ORDER BY RAND() LIMIT 0, 6)
UNION
(SELECT * FROM `imageTable`  WHERE `id` = 'foo' OR `id` = 'bar' OR `id` = 'baz')

Ответы [ 3 ]

4 голосов
/ 18 января 2011

Вы можете попробовать команду union в sql.

select random
  union
select choosed
1 голос
/ 18 января 2011

Объедините их вместе, но не позволяйте X и Y показывать более одного раза Вы также можете использовать IN вместо нескольких операторов OR, чтобы быть более кратким.

SELECT foo FROM (
    SELECT foo FROM `imageTable`
    WHERE id NOT IN ('x','y','z')
    ORDER BY RAND() LIMIT 0, 9    # reduce by 3
) A
UNION ALL
SELECT foo FROM (
    SELECT foo FROM `imageTable`
    WHERE id IN ('x','y','z')
) B
ORDER BY RAND()    # order again so that x,y,z are anywhere in the set
1 голос
/ 18 января 2011

Вы можете попробовать объединение ...

<pre> (SELECT foo FROM <code>imageTable ГДЕ id нет в ('x', 'y') ORDER BY RAND () LIMIT 0, 12;) UNION (ВЫБЕРИТЕ foo ОТ imageTable ГДЕ id in ('x', 'y') ЗАКАЗАТЬ ПО ПРЕДЕЛУ 10;

...