С нами с 21.06.05
Сообщения: 1788
Рейтинг: 1579
|
Добавлено: 30/06/06 в 21:02 |
Запросу в базу соответствует несколько строк, нужно выбрать одну в случайным образом. На стороне сервера mysql это можно сделать?
|
|
|
|
С нами с 21.06.05
Сообщения: 1788
Рейтинг: 1579
|
Добавлено: 30/06/06 в 21:07 |
Разобрался
SELECT *
FROM `table`
WHERE 1=1
ORDER BY RAND( )
LIMIT 1
всем спасибо
|
|
|
|
programmer
С нами с 08.12.02
Сообщения: 7614
Рейтинг: 5760
|
Добавлено: 30/06/06 в 21:22 |
да не за что.
хоть бы рейтингу за помощь подкинул
|
|
|
|
С нами с 19.09.03
Сообщения: 1988
Рейтинг: 1247
|
Добавлено: 30/06/06 в 21:46 |
Если при этом запросов будет много, то мускуль умрет вместе с твоим сервером.
Лучше сделать в таблице индексированное поле со случайными числами, например, и делать rand(0,10) в скрипте, а мускулю давать команду без вычислений.
|
|
|
|
С нами с 30.06.06
Сообщения: 79
Рейтинг: 78
|
Добавлено: 30/06/06 в 22:47 |
ORDER BY rand() вешает любой сервак при условии, что в таблицах из которых производится выборка SELECT + все JOIN очень много записей. При большом количестве данных метод не рулит.
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 01/07/06 в 00:52 |
I-Tog писал: | ORDER BY rand() вешает любой сервак при условии, что в таблицах из которых производится выборка SELECT + все JOIN очень много записей. |
Он вешает сервак при условии что сама по себе выборка (с учетом джойнов и WHERE) большая. Либо если таблицы большие, выборка маленькая и неоптимально расставлены индексы (впрочем как любой другой запрос).
Если выборка небольшая, нужно делать "SELECT SQL_SMALL_RESULT * FROM table WHERE 1=1 ORDER BY RAND()" чтобы временная таблица для сортировки создавалась в оперативе, а не на диске. Тогда будет быстро проходить запрос.
|
|
|
|
С нами с 03.07.05
Сообщения: 474
Рейтинг: 231
|
Добавлено: 01/07/06 в 12:14 |
-1 за метод. Сервер быстро умирает. Лучше использовать другие связки.
Например. Считываем кол-во записей в mysql, rand на php выбираем число в интервале и делаем LIMIT $rand,1.
Или же предопределяем различные способы сортировок.
Или же делаем все в текстовике и не юзаем mysql
|
|
|
|
programmer
С нами с 08.12.02
Сообщения: 7614
Рейтинг: 5760
|
Добавлено: 01/07/06 в 13:07 |
а вообще, сорри что вклиниваюсь, тоже стараюсь вытащить из мускуля массив и работать с ним, оптимально ли это в конечном итоге?
там туева хуча SQL вариаций тоб делать это в базе.
неужель такой хлипкЫй mysql?
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 01/07/06 в 15:26 |
netzoner писал: | -1 за метод. Сервер быстро умирает. Лучше использовать другие связки.
Например. Считываем кол-во записей в mysql, rand на php выбираем число в интервале и делаем LIMIT $rand,1.
Или же предопределяем различные способы сортировок.
Или же делаем все в текстовике и не юзаем mysql |
Если знаешь что делаешь, то метод нормальный.
|
|
|
|
С нами с 03.07.05
Сообщения: 474
Рейтинг: 231
|
Добавлено: 01/07/06 в 20:34 |
не спорю. просто незнаем же мы объемов с какими надо работать а вообще если подумать - то может можно и по другому решить вопрос ;)
|
|
|
|
С нами с 21.06.05
Сообщения: 1788
Рейтинг: 1579
|
Добавлено: 01/07/06 в 22:19 |
таблица - много тысяч строк, условию удовлетворяют от сотни до тысячи. нужна только одна строка - так как лучше сделать?
Цитата: | Лучше сделать в таблице индексированное поле со случайными числами, например, и делать rand(0,10) в скрипте, а мускулю давать команду без вычислений. |
или
Цитата: | Если выборка небольшая, нужно делать "SELECT SQL_SMALL_RESULT * FROM table WHERE 1=1 ORDER BY RAND()" чтобы временная таблица для сортировки создавалась в оперативе, а не на диске. Тогда будет быстро проходить запрос. |
или
Цитата: | Считываем кол-во записей в mysql, rand на php выбираем число в интервале и делаем LIMIT $rand,1.
Или же предопределяем различные способы сортировок. |
|
|
|
|
С нами с 21.06.05
Сообщения: 1788
Рейтинг: 1579
|
Добавлено: 01/07/06 в 22:22 |
Sterx писал: | да не за что.
хоть бы рейтингу за помощь подкинул |
всем +6. кушайте
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 02/07/06 в 04:51 |
В твоем случае третий вариант будет оптимален.
Быстро считать количество строк можно запросом "SHOW TABLE STATUS like 'таблица'". Там будет колонка "Rows", содержащая количество строк. Правда это работает вроде только для MyISAM таблиц.
потом вычисляешь ранд от 0 до этого числа и делаешь запрос ".... limit ранд,1"
Ибо файлсорт для пары тысячей записей это не есть гуд
|
|
|
|
С нами с 21.06.05
Сообщения: 1788
Рейтинг: 1579
|
Добавлено: 02/07/06 в 12:22 |
Цитата: | Быстро считать количество строк можно запросом "SHOW TABLE STATUS like 'таблица'". Там будет колонка "Rows", содержащая количество строк. Правда это работает вроде только для MyISAM таблиц. |
Нужно выбрать одну из строк, удовлетворяющим условию. Может тогда COUNT?
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 02/07/06 в 13:58 |
тогда count(*)
|
|
|
|
www.phpdevs.com
С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105
|
Добавлено: 02/07/06 в 14:48 |
COUNT(*) советую никогда не делать.
COUNT(primary_key) всегда работает быстрее и требует меньше ресурсов, это фактически во всех доках по разным базам указано.
|
|
Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.
|
6
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 02/07/06 в 23:25 |
та не, count(*) это аналог count(primary key) в понятиях MyISAM во всяком случае.
|
|
|
|