1

Тема: Выбор случайной записи в группе

Здравствуйте!
У меня есть компании которые размещают свои товары, у товаров есть один из параметров цвет.
Мне надо выбрать один случайный товар у каждой из 9 первых компаний, цвет которого соответствует запросу.
Вот мой пример запроса в котором я получаю компании и их товары с соответствующим цветом, но как теперь случайным образом выбрать один товар у каждого из 9-ти не знаю, помогите пожалуйста.
Записей будет очень много более 3-4 миллионов

SELECT products.`uniq_id` , products.id_product, products.article_product, page_up.date_page_up
FROM images_products AS products, products_color AS color, data_page_up AS page_up
WHERE products.uniq_id = page_up.uniq_id
AND products.id_product = color.id_product
AND color.colors_name
IN ( 1, 4, 12, 15 )
GROUP BY products.id_product
ORDER BY page_up.date_page_up DESC 

2

Re: Выбор случайной записи в группе

Добавьте поле RAND() и отсортируйте по нему.

SELECT products.`uniq_id` , products.id_product, products.article_product, page_up.date_page_up, RAND() AS `rand`
...
ORDER BY `rand`

3 (изменено: Boris, 2015-04-25 14:00:52)

Re: Выбор случайной записи в группе

Hanut сказал:

Добавьте поле RAND() и отсортируйте по нему.

SELECT products.`uniq_id` , products.id_product, products.article_product, page_up.date_page_up, RAND() AS `rand`
...
ORDER BY `rand`

Спасибо.
Подскажите если большое количество строк, как будет вести себя RAND()
И пожалуйста, объясните каким образом из группы это выбирает единственный случайный, спасибо вам огромное за идею
P.S. и еще мне надо отсортировать и по page_up.date_page_up, как быть?

4

Re: Выбор случайной записи в группе

В ORDER BY через запятую добавьте дополнительное поле сортировки.

Попробуйте проверить скорость выполнения запроса с RAND() и без него. Думаю разница будет не значительная.

Вопрос по выбору единственного случайного из группы - я не понял. Пример с RAND() вернет дополнительное поле имеющее случайное число, при сортировке по этому полю, вы будете получать разные последовательности сортировки, в зависимости от случайного числа. Выполните запрос с RAND() и посмотрите что возвращает поле, чтобы лучше понять. Если необходимо как-то еще сузить выборку, то нужен пример с данными и структурой таблицы.

5 (изменено: Boris, 2015-04-26 11:48:32)

Re: Выбор случайной записи в группе

Hanut сказал:

В ORDER BY через запятую добавьте дополнительное поле сортировки.

Попробуйте проверить скорость выполнения запроса с RAND() и без него. Думаю разница будет не значительная.

Вопрос по выбору единственного случайного из группы - я не понял. Пример с RAND() вернет дополнительное поле имеющее случайное число, при сортировке по этому полю, вы будете получать разные последовательности сортировки, в зависимости от случайного числа. Выполните запрос с RAND() и посмотрите что возвращает поле, чтобы лучше понять. Если необходимо как-то еще сузить выборку, то нужен пример с данными и структурой таблицы.


Идею с RAND() понял, но у меня задача более специфическая.
Структура такая:
images_products имеет ключ компании и ключ товара-индекс ,
products_color имеет ключ товара и поле цвета в таблице нет индексов так как у товара может быть несколько цветов соответственно на один товар несколько записей
data_page_up имеет ключ компании-индекс и поле int  в нем дата в виде int

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

6

Re: Выбор случайной записи в группе

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