Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Случайная выборка строки из БД Sybase 12.5 
:(
    Опции темы
VSergeyV
Дата 5.9.2006, 06:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 299
Регистрация: 9.5.2006
Где: Новосибирск

Репутация: нет
Всего: 3



Нужно, делать случайную выборку из БД /Sybase 12.5/ одной строки /для конкурса, определение победителей/
В MySQL проходит такая штука, причем об этом написано даже в мануале к нему /Следует учитывать, что оператор RAND() в выражении WHERE при выполнении выражения WHERE будет вычисляться каждый раз заново/
Код

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

Либо так даже
Код

SELECT * FROM table ORDER BY RAND() LIMIT 1


В Sybase 12.5 это не проходит, т.к. как я понял значение RAND() для запроса вычисляется единожды

Пример
Код

SELECT Phone,rand() FROM mod_happy_ticket WHERE Phone>0 ORDER BY RAND()


Результат

Phone               rand() 
789777    .98420166176939461
789777    .98420166176939461
789777    .98420166176939461
789777    .98420166176939461
789777    .98420166176939461
789777    .98420166176939461
789777    .98420166176939461
789777    .98420166176939461
789777    .98420166176939461
79139166670    .98420166176939461


Как нибудь, в Субасе можно сделать это??? В виде хранимой процедуры...

Это сообщение отредактировал(а) VSergeyV - 5.9.2006, 07:07
PM MAIL ICQ   Вверх
chief39
Дата 5.9.2006, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 8
Всего: 77



Цитата(VSergeyV @  5.9.2006,  06:49 Найти цитируемый пост)
SELECT * FROM table WHERE 1=1 ORDER BY RAND() LIMIT 1

 - Не совсем понятно зачем 1=1 добавил на ровном месте.
 - И... интересный вариант выбора "случайной строки" smile - сортировка по непонятному полю.
Количество "случайных вариантов" = количеству столбцов. Небольшой разброс значений однако....

Чесс говоря, не помню уже, но, кажется, есть ранд с параметром.

Да... вот не помню, если в селекте указать
Код

select @tmp_var = field1
from bla-bla...

кажется, выберется последняя запись.
Можно просто ставить роукаунт по рандому(до количества строк в таблице), делать выборку, получать айди строки в переменную и выбирать уже целенаправленно по айди одну нашу строку

надо уточнить:
 - rand(param) и
 - порядок строк в select @tmp_var = field1



--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
DrDred
Дата 15.9.2006, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 14.9.2006
Где: Земля

Репутация: нет
Всего: 2



Можно так вот поступить (для выборки одной строки)
Код

declare @rnd_id int
select @rnd_id = max(id) from <table>
select @rnd_id = @rnd_id * rand() 

-- если мы через random не попадаем точно на id записи, выбираем ближайшую
set rowcount 1

select * from <table> order by @rnd_id - id

set rowcount 0


PM MAIL WWW ICQ   Вверх
VSergeyV
Дата 26.9.2006, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 299
Регистрация: 9.5.2006
Где: Новосибирск

Репутация: нет
Всего: 3



Я меня еще не только выборка случаной строки из БД, но и еще по условию, а точнее по диапозону дат

вообщем у меня сейчас так
Код

CREATE PROCEDURE dbo.mod_happy_ticket_HReg 
( 
    @startdate DateTime,
    @finishdate DateTime   
) 
AS 
BEGIN 
   set rowcount 1
   select t.IdRegistration, Phone, (select rand(t.IdRegistration)+t.phone) RandomNumber from mod_happy_ticket t WHERE t.datetime>@startdate AND t.datetime<@finishdate ORDER BY RandomNumber
END



Все работает, вот, правдо при многократных запусках на неизменном наборе данных получается. одна и таже строка, т.е. как бы не рандомайза, но мне этого и не требуется
Вопросы
1) DrDred пишет в листинге в конце 
Код
set rowcount 0
 Т.е. надо сбрасывать
2) При больших значения IdRegistration 
Код
rand(t.IdRegistration)
 переполнения не будет ранда?
PM MAIL ICQ   Вверх
chief39
Дата 26.9.2006, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 8
Всего: 77



Цитата(VSergeyV @  26.9.2006,  13:29 Найти цитируемый пост)
2) При больших значения IdRegistration 
Выделить всёкод SQL
1:
    
rand(t.IdRegistration)
 переполнения не будет ранда? 

Погляди что принимает ранд. И какой у тебя IdRegistration.
А заодно проверь вручную smile


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Общие вопросы по базам данных"
LSD
Zloxa

Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:

  • вопросам по СУБД для которых нет отдельных подфорумов
  • вопросам которые затрагивают несколько разных СУБД (например проблема выбора)
  • инструменты для работы с СУБД
  • вопросы проектирования БД
  • теоретически вопросы о СУБД

Данный форум не предназначен для:

  • вопросов о поиске разлиных БД (если не понимаете чем БД отличается от СУБД то: а) вам не сюда; б) Google в помощь)
  • обсуждения проблем с доступом к СУБД из различных ЯП (для этого есть соответсвующие форумы по каждому ЯП)
  • обсуждения проблем с написание SQL запросов, для этого есть форум Составление SQL-запросов
  • просьб о написании курсовой, реферата и т.п., для этого есть Центр помощи или фриланс биржа
  • объявлений о найме специалистов, для этого есть раздел Объявления о найме специалистов

Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение. ;)


Полезные советы:

При написании сообщения постарайтесь дать теме максимально понятное название. В теме максимально подробно опишите проблему. Если применимо укажите: название базы данных и версии (MySQL 4.1, MS SQL Server 2000 и т.п.); используемых язык программирования; способа доступа (ADO, BDE и т.д.); сообщения об ошибках.

Для вставки кода используйте теги [code=sql] [/code].

Литературу по базам данных можно поискать здесь.

Действия модераторов можно обсудить здесь.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | СУБД, общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0425 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.