Реклама на сайте Advertise with us

SQL: случайная строка

Расширенный поиск по форуму
 
Новая тема Новая тема   
Автор
Поиск в теме:



С нами с 21.06.05
Сообщения: 1788
Рейтинг: 1579

Ссылка на сообщениеДобавлено: 30/06/06 в 21:02       Ответить с цитатойцитата 

Запросу в базу соответствует несколько строк, нужно выбрать одну в случайным образом. На стороне сервера mysql это можно сделать?

ВОСТОРГ ЗНАЧИТ BMW

0
 



С нами с 21.06.05
Сообщения: 1788
Рейтинг: 1579

Ссылка на сообщениеДобавлено: 30/06/06 в 21:07       Ответить с цитатойцитата 

Разобрался

SELECT *
FROM `table`
WHERE 1=1
ORDER BY RAND( )
LIMIT 1

всем спасибо icon_smile.gif

ВОСТОРГ ЗНАЧИТ BMW

0
 

programmer

С нами с 08.12.02
Сообщения: 7614
Рейтинг: 5760

Ссылка на сообщениеДобавлено: 30/06/06 в 21:22       Ответить с цитатойцитата 

да не за что.
хоть бы рейтингу за помощь подкинул icon_smile.gif

крипта на ByBit

6
 



С нами с 19.09.03
Сообщения: 1988
Рейтинг: 1247


Передовик Master-X (01.02.2004) Передовик Master-X (16.03.2004)
Ссылка на сообщениеДобавлено: 30/06/06 в 21:46       Ответить с цитатойцитата 

Если при этом запросов будет много, то мускуль умрет вместе с твоим сервером.
Лучше сделать в таблице индексированное поле со случайными числами, например, и делать rand(0,10) в скрипте, а мускулю давать команду без вычислений.

6
 



С нами с 30.06.06
Сообщения: 79
Рейтинг: 78

Ссылка на сообщениеДобавлено: 30/06/06 в 22:47       Ответить с цитатойцитата 

ORDER BY rand() вешает любой сервак при условии, что в таблицах из которых производится выборка SELECT + все JOIN очень много записей. При большом количестве данных метод не рулит.

6
 

Криптопохуист

С нами с 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()" чтобы временная таблица для сортировки создавалась в оперативе, а не на диске. Тогда будет быстро проходить запрос.

6
 



С нами с 03.07.05
Сообщения: 474
Рейтинг: 231

Ссылка на сообщениеДобавлено: 01/07/06 в 12:14       Ответить с цитатойцитата 

-1 за метод. Сервер быстро умирает. icon_smile.gif Лучше использовать другие связки.
Например. Считываем кол-во записей в mysql, rand на php выбираем число в интервале и делаем LIMIT $rand,1.
Или же предопределяем различные способы сортировок.
Или же делаем все в текстовике и не юзаем mysql icon_smile.gif

6
 

programmer

С нами с 08.12.02
Сообщения: 7614
Рейтинг: 5760

Ссылка на сообщениеДобавлено: 01/07/06 в 13:07       Ответить с цитатойцитата 

а вообще, сорри что вклиниваюсь, тоже стараюсь вытащить из мускуля массив и работать с ним, оптимально ли это в конечном итоге?
там туева хуча SQL вариаций тоб делать это в базе.
неужель такой хлипкЫй mysql?

крипта на ByBit

6
 

Криптопохуист

С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019

Ссылка на сообщениеДобавлено: 01/07/06 в 15:26       Ответить с цитатойцитата 

netzoner писал:
-1 за метод. Сервер быстро умирает. icon_smile.gif Лучше использовать другие связки.
Например. Считываем кол-во записей в mysql, rand на php выбираем число в интервале и делаем LIMIT $rand,1.
Или же предопределяем различные способы сортировок.
Или же делаем все в текстовике и не юзаем mysql icon_smile.gif


Если знаешь что делаешь, то метод нормальный.

6
 



С нами с 03.07.05
Сообщения: 474
Рейтинг: 231

Ссылка на сообщениеДобавлено: 01/07/06 в 20:34       Ответить с цитатойцитата 

не спорю. просто незнаем же мы объемов с какими надо работать icon_smile.gif а вообще если подумать - то может можно и по другому решить вопрос ;)

6
 



С нами с 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.
Или же предопределяем различные способы сортировок.

icon_smile.gif

ВОСТОРГ ЗНАЧИТ BMW

0
 



С нами с 21.06.05
Сообщения: 1788
Рейтинг: 1579

Ссылка на сообщениеДобавлено: 01/07/06 в 22:22       Ответить с цитатойцитата 

Sterx писал:
да не за что.
хоть бы рейтингу за помощь подкинул icon_smile.gif


всем +6. кушайте icon_biggrin.gif

ВОСТОРГ ЗНАЧИТ BMW

0
 

Криптопохуист

С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019

Ссылка на сообщениеДобавлено: 02/07/06 в 04:51       Ответить с цитатойцитата 

В твоем случае третий вариант будет оптимален.

Быстро считать количество строк можно запросом "SHOW TABLE STATUS like 'таблица'". Там будет колонка "Rows", содержащая количество строк. Правда это работает вроде только для MyISAM таблиц.

потом вычисляешь ранд от 0 до этого числа и делаешь запрос ".... limit ранд,1"

Ибо файлсорт для пары тысячей записей это не есть гуд

6
 



С нами с 21.06.05
Сообщения: 1788
Рейтинг: 1579

Ссылка на сообщениеДобавлено: 02/07/06 в 12:22       Ответить с цитатойцитата 

Цитата:
Быстро считать количество строк можно запросом "SHOW TABLE STATUS like 'таблица'". Там будет колонка "Rows", содержащая количество строк. Правда это работает вроде только для MyISAM таблиц.


Нужно выбрать одну из строк, удовлетворяющим условию. Может тогда COUNT?

ВОСТОРГ ЗНАЧИТ BMW

0
 

Криптопохуист

С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019

Ссылка на сообщениеДобавлено: 02/07/06 в 13:58       Ответить с цитатойцитата 

тогда count(*)

3
 

www.phpdevs.com

С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105


Передовик Master-X (01.09.2005) Передовик Master-X (16.09.2005) Передовик Master-X (01.10.2005) Передовик Master-X (16.08.2006) Передовик Master-X (16.10.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 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 во всяком случае.

0
 
Новая тема Новая тема   

Текстовая реклама в форме ответа
Заголовок и до четырех строчек текста
Длина текста до 350 символов
Купить рекламу в этом месте!


Перейти:  



Спонсор раздела Стань спонсором этого раздела!

Реклама на сайте Advertise with us

Опросы

Рецепт новогоднего блюда 2022



Обсудите на форуме обсудить (11)
все опросы »