1 (изменено: элекроник, 2012-04-13 21:36:31)

Тема: нужно сделать рандомную выборку через ORDER BY RAND()

здравствуйте

нужно сделать рандомную выборку полей id и number по id

когда делаю вот так: (вариант 1)

$res = mysql_query("SELECT id,number FROM table WHERE id BETWEEN 10 AND 20 ORDER BY RAND() LIMIT 3",$db) or die("Ошибка 1");
while ($row = mysql_fetch_array($res)) {
echo $row['id'] . '<br>' . $row['number'] . '<br><br>';
}

вроде всё работает как надо, все три числа/id разные (ни разу не попадались одинаковые)
но дело в том что мне тут не нужен диапазон от 10 и до 20. нужно чтобы выбор происходил из всех id которые есть в таблице

но если делаю так: (вариант 2)

$res = mysql_query("SELECT id,number FROM table ORDER BY RAND() LIMIT 3",$db) or die("Ошибка 1");
while ($row = mysql_fetch_array($res)) {
echo $row['id'] . '<br>' . $row['number'] . '<br><br>';
}

то выбираются одинаковые id (почти при каждом обновлении страницы), чего бы хотелось избежать
почему так?
и как это исправить?

2

Re: нужно сделать рандомную выборку через ORDER BY RAND()

Необходимо немного изменить запрос:

SELECT `id`, `number`, RAND() AS `rand`
FROM `table`
ORDER BY `rand`
LIMIT 3

3 (изменено: элекроник, 2012-04-14 13:15:43)

Re: нужно сделать рандомную выборку через ORDER BY RAND()

Необходимо немного изменить запрос:

к сожалению получается так же как и у меня в (вариант 2)
то есть "выбираются одинаковые id (почти при каждом обновлении страницы)"
что же с этим делать

---
не получалось из-за моей ошибки,
после её исправления всё работает как нужно
поэтому этот вариант я и использую, Hanut ещё раз большое спасибо!

4

Re: нужно сделать рандомную выборку через ORDER BY RAND()

Попробуйте так:

SELECT `id`, `number`, RAND() AS `rand`
FROM `table`
GROUP BY `id`
ORDER BY `rand`
LIMIT 3

5 (изменено: элекроник, 2012-04-13 22:31:27)

Re: нужно сделать рандомную выборку через ORDER BY RAND()

Попробуйте так:

сейчас дам ответ
(по моему я недопустимо ступил) так и есть, даже не знаю как такой тупёж объяснить, ох как стыдно

Hanut,
всё исправил и пробовал теперь обновлять страницу много раз и в предложенном вами первом и втором варианте одинаковые записи не выводятся, то есть что и требовалось :)

но не могли бы вы ответить ещё на несколько вопросов
1. что означает `rand` в ваших вариантах?
2. допускается ли (в ваших двух вариантах) вероятность совпадений выводимых запросов (хоть я этого и не заметил) ?,
и какой из них лучше использовать?

6

Re: нужно сделать рандомную выборку через ORDER BY RAND()

элекроник сказал:

1. что означает `rand` в ваших вариантах?

`rand` - это алиас (короткое имя) для функции RAND(). То есть мы добавляем к каждой строке к полям `id` и `number` поле `rand` содержащее случайное число. В последствии мы по этому случайному числу сортируем с помощью конструкции ORDER BY `rand`.

элекроник сказал:

2. допускается ли (в ваших двух вариантах) вероятность совпадений выводимых запросов (хоть я этого и не заметил) ?,
и какой из них лучше использовать?

Ответ зависит от структуры вашей таблицы.

Если поле id является первичным или уникальным ключом, то повторяться оно не будет никогда.
Если id - это не индекс, а просто поле и в нем могут быть повторяющиеся значения, то используйте вариант с GROUP BY `id`.

Re: нужно сделать рандомную выборку через ORDER BY RAND()

Hanut вы мой герой :)))
каждый раз вам поражаюсь, как вы один на весь форум, столько знаете, и так доступно объясняете
спасибо вам огромаднейшее!!! в который раз :)