Firebird vtden random kayıt çeken komut
- omerdurmus
- Üye
- Mesajlar: 60
- Kayıt: 11 Kas 2005 03:32
- Konum: Amasya
Firebird vtden random kayıt çeken komut
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)
(not: Delphi içinden yapabiliyoruz ama böyle bir şey varsa daha kısa şekilde olay çözülmüş olur)
...
- Terminator
- Üye
- Mesajlar: 313
- Kayıt: 13 Ara 2005 01:45
- Konum: İzmir, ama Aydın Efesi!
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.
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
http://www.firebirdsql.org
- omerdurmus
- Üye
- Mesajlar: 60
- Kayıt: 11 Kas 2005 03:32
- Konum: Amasya
Kod: Tümünü seç
caption := IntToStr(Random(Table1.RecordCount));
- Terminator
- Üye
- Mesajlar: 313
- Kayıt: 13 Ara 2005 01:45
- Konum: İzmir, ama Aydın Efesi!
kendime has bişeyler diyebilmen için kendin yapmalısın..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.

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
http://www.firebirdsql.org
hazır udf liblary olarak:ara rfunc
http://rfunc.sourceforge.net/
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.
.-.-.-.-.-.-.-. ^_^
- Terminator
- Üye
- Mesajlar: 313
- Kayıt: 13 Ara 2005 01:45
- Konum: İzmir, ama Aydın Efesi!
where kullanmadığın için, bu komut natural çalışacaktır.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.
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
http://www.firebirdsql.org
- Terminator
- Üye
- Mesajlar: 313
- Kayıt: 13 Ara 2005 01:45
- Konum: İzmir, ama Aydın Efesi!
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.
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
http://www.firebirdsql.org