Firebird vtden random kayıt çeken komut

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
omerdurmus
Üye
Mesajlar: 60
Kayıt: 11 Kas 2005 03:32
Konum: Amasya

Firebird vtden random kayıt çeken komut

Mesaj gönderen omerdurmus »

Bir arkadaşım mysql içinden random kayıt çeken komut olduğunu söylemişti. Bunun bir benzeri firebirdde varmı acaba?
(not: Delphi içinden yapabiliyoruz ama böyle bir şey varsa daha kısa şekilde olay çözülmüş olur)
...
Kullanıcı avatarı
Terminator
Üye
Mesajlar: 313
Kayıt: 13 Ara 2005 01:45
Konum: İzmir, ama Aydın Efesi!

Mesaj gönderen Terminator »

Doğrudan bir komutu yok ama basitçe yapabilmen için şuan aklıma gelen 2-3 yöntem var.
1. UDF fonksiyonlarını kullanarak random sayı üretebilirsin.
2. 'NOW' değişkenini işleme sokarak random sayı üretebilirsin.
3. SP yazarak hem random sayı üretetip hem de random kaydı getirebilirsin.
vs vs..
dikkat etmen gereken, ürettiğin random sayının, en son kayıt numarası veya daha küçük olması. bunu da ilgili generatorden ya da max çekerek alabilirsin.
Şimdiye kadar hiç tesadüfi kayıt okuma ihtiyacı duymadım, ama çok lazımsa yapılabilir tabiki. Lotary türü bir çekiliş yaptırmak istiyorsan da bunun daha mantıklı yolları var bence.
Firebird Foundation Member #208
http://www.firebirdsql.org
Kullanıcı avatarı
omerdurmus
Üye
Mesajlar: 60
Kayıt: 11 Kas 2005 03:32
Konum: Amasya

Mesaj gönderen omerdurmus »

bir tabloda kayıtlı ipuçları var her açılışta rasgele bir tanesini çağırmak için böyle bir şey arıyorum. aslında JEDI paketinde istediğim şeyi yapan komponent var ama ben kendime has birşeyler yapmak için arıyorum.
...
Kullanıcı avatarı
hbahadir
Kıdemli Üye
Mesajlar: 544
Kayıt: 06 Ara 2004 05:03
Konum: BURSA idi artık İST.
İletişim:

Mesaj gönderen hbahadir »

Kod: Tümünü seç

caption := IntToStr(Random(Table1.RecordCount));
Random sayı üreterek (kayıt sayısını aşmaması lazım) veritabanından o kaydı çekebilirsin.
Kullanıcı avatarı
Terminator
Üye
Mesajlar: 313
Kayıt: 13 Ara 2005 01:45
Konum: İzmir, ama Aydın Efesi!

Mesaj gönderen Terminator »

omerdurmus yazdı:bir tabloda kayıtlı ipuçları var her açılışta rasgele bir tanesini çağırmak için böyle bir şey arıyorum. aslında JEDI paketinde istediğim şeyi yapan komponent var ama ben kendime has birşeyler yapmak için arıyorum.
kendime has bişeyler diyebilmen için kendin yapmalısın.. ;)

tabloların kayıtlarını saymamaya çalışın, bu, FB de en masraflı işlemdir. tabloya ait bütün kayıtlar(eski yeni versiyon farketmez) okunarak uygun olanlar sayılır, yani bu bir full-scan read işlemidir.
komponentler sizi aldatmasın.
Firebird Foundation Member #208
http://www.firebirdsql.org
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Mesaj gönderen mege »

hazır udf liblary olarak:ara rfunc
http://rfunc.sourceforge.net/
InitRandom(i) i 4-7 2.0.0 Initialization of the generator of pseudorandom numbers.
GetRandom(i) i 4-7 2.0.0 Pseudorandom numbers in a range 0..i.
.-.-.-.-.-.-.-. ^_^
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

SELECT FIRST 1 SKIP 100 * FROM URUN

100 yerine kodun içinden random bir sayı atarsın.

Tabi bu sayıyı maksimum kayıt sayısı kontrolüyle kontrol edersin.

İyi çalışmalar.
Kullanıcı avatarı
Terminator
Üye
Mesajlar: 313
Kayıt: 13 Ara 2005 01:45
Konum: İzmir, ama Aydın Efesi!

Mesaj gönderen Terminator »

Hakan Can yazdı:SELECT FIRST 1 SKIP 100 * FROM URUN

100 yerine kodun içinden random bir sayı atarsın.

Tabi bu sayıyı maksimum kayıt sayısı kontrolüyle kontrol edersin.

İyi çalışmalar.
where kullanmadığın için, bu komut natural çalışacaktır.
yani sen select first 1 skip 129623 dediğin zaman FB
129624. kayıda ulaşana kadar bütün kayıtları okumak zarundadır.
bu da kötü bir kullanım.
doğrusu şu: (ama arkadaş random sayıyı da clienttan göndermek istemediği için vermemiştim)

select max(id) from mytable into :limit; -- ya da generatorünü alırsın
myid=random(limit); -- ya da myid=random(gen_id(mytable_id_gen,0));
select FIRST 1 * from mytable where id>=:myid

bunu procedure haline getirse, kolaylıkla tek satır olarak kullanabilir.
Firebird Foundation Member #208
http://www.firebirdsql.org
Kullanıcı avatarı
Terminator
Üye
Mesajlar: 313
Kayıt: 13 Ara 2005 01:45
Konum: İzmir, ama Aydın Efesi!

Mesaj gönderen Terminator »

yok ben procedure istemiyom, illaki tek bir query kullanacam diye tutturursa da:

select FIRST 1 * from mytable
where id>= random(gen_id(mytable_id_gen,0))

veya

select FIRST 1 * from mytable
where id>= random(select max(id) from mytable)

randomu kendisi delphi ile UDF olarak yazabilir ya da hazırını kullanır.
Firebird Foundation Member #208
http://www.firebirdsql.org
Cevapla