Tam Sürümünü Görmek İçin : bir çok tabloda arama
DotNetKid
16/02/2006, 09:31
mrb arkadaşlar;
VT mizde bulunan birden fazla tablonun birden fazla alanında arama yapmak içinde genelde kullanılan yöntem malumunuz, arama formunda kullanıcıya hangi bölümde arama yapacağı konusunda seçim yaptırmak.
peki tüm sitede yani tüm tabloları bir tablo imiş gibi farz edip arama yaptırmak için nasıl bir mantık kullanabilriz sizce..
bazı tablolarımız bir veya daha fazla tablo ile ilişki içerisinde olabilir..
doronty37
16/02/2006, 09:39
bu yöntem çok yavaşlatır ama başka çaresi de yok gibi:
SQL = "SELECT Tablo1.*, Tablo2.*, Tablo3.* FROM Tablo1, Tablo2, Tablo3"
arama kriterlerini ve tablo yapılarını yazarsan WHERE kısmında da yardımcı olabilirim.
DotNetKid
16/02/2006, 10:47
tşk ederim. bunu biliyorum. böyle olmaz. bu sefer ilişkili tablolarda aynı kayıtları birçok defa getirir. vs başka başka sorunlarda oluşur..
neyse en iyisi kullanıcıya bölüm seçtirmek.. saolasın..
Skeleton
16/02/2006, 11:27
İlişkili alanlara göre JOIN yapacaksın aramak istediğin tüm tabloları. Bu zaten sana o tabloların hepsindeki alanlarda istediğin kriteri belirlemeni sağlayacaktır. Yani
SELECT * FROM tablo1 AS t1 INNER JOIN tablo2 AS t2 ON
t1.id = t2.fId INNER JOIN tablo3 AS t3 ON
t2.id = t3.fId WHERE t1.alan1 = 'krite1' AND t2.alan2 = 'kriter2' AND t3.alan3 = 'kriter3'
gibi.
niyazitaha
16/02/2006, 16:49
bence şunu dene;
kelime = request.querystring("aranan")
<% Set rs = conn.execute("select baslik,icerik from icerik where baslik='%" & kelime & "%' or icerik='%" & kelime & "%'") %>
bunun gibi rs leri çoğaltarak aynı anda aratabilirsin.çünkü yukarıda bir sql sorgusunda aynı anda birden fazla tabloda arama cidden cpu yu çok zorlar.bence bu yöntem daha makul.
SELECT 'tablo1' AS tabloadi, kayitno AS id
FROM tablo1
WHERE alan1 LIKE '%kelime%' OR alan2 LIKE '%kelime%'
UNION
SELECT 'tablo2' AS tabloadi, kayitno AS id
FROM tablo2
WHERE alan1 LIKE '%kelime%' OR alan2 LIKE '%kelime%'
UNION
SELECT 'tablo3' AS tabloadi, kayitno AS id
FROM tablo3
WHERE alan1 LIKE '%kelime%' OR alan2 LIKE '%kelime%'
UNION
SELECT 'tablo4' AS tabloadi, kayitno AS id
FROM tablo5
WHERE alan1 LIKE '%kelime%' OR alan2 LIKE '%kelime%'
DotNetKid
17/02/2006, 10:02
@acemi: yazdıgın kod performans açısından nasıl acaba?
iki sorum daha olacak..
1-
key = "ali" sözcüğünü arattığımız farzedelim;
adi LIKE '%"& key &"%' yazdığımızda, salih kelimesini de görüntülüyor. sadece ali olanları nasıl listeleriz..
2- key = "ali veli" sözcüklerini aratırken;
arama formudan iki tane seçeneğimiz var;
1- aynen girildiği gibi, 2- kelimelerden herhangi biri
bu iki kriteri nasıl SQL ile yazabilirim..
yardımlarınız için tşk.ler...
doronty37
17/02/2006, 12:03
1.
adi LIKE '"& key &"'
stringlerde arama yaparken % joker karakterdir.
2.
aynen girildiği gibi:
adi LIKE '"& key &"'
herhangi biri
arrKelimeler = Split(key," ")
For Each kelime in arrKelimeler
OR adi LIKE '"& kelime &"'
Next
burada AND ve OR kısımlarını tam SQL ifadesi içinde ayarlamalısın.
DotNetKid
17/02/2006, 14:09
tşk. ler arkadaşlar @doronty37: saolasın hemen deniyorum..
DotNetKid
17/02/2006, 14:45
olmadı..
1-
" Salih UĞUR " ve " Ahmet ORTAK " diye iki kaydımız var.
... adi LIKE '"& key &"' dediğim zaman " salih " kelimesinin geçtiği kaydı bulmuyor..
2- kelimelerden herhangi biri .. için:
keyy = Split(key, " ")
For Each aranan in keyy
SQL = " SELECT * FROM Tablo1 INNER JOIN Tablo2 ON [Tablo1].ID = [Tablo2].CatNo WHERE adi LIKE '"& aranan &"' "
Rs.Open SQL, bag, 1, 3
Next
yukarıda ki koda key = "Salih" gönderdiğim zaman bulması gereken bir kayıt varken bulmuyor.
Fakat key = "Salih UĞUR" gönderdiğim zaman da bulmuyor ve SQL kodu goruntuledigimde aşağıdaki gibi çalıştırıyor:
... adi LIKE 'UĞUR'
yani sadece ikinci kelimeye bakıyor sanırım..
doronty37
17/02/2006, 15:57
1.si için şunu deneyebilirsin:
adi LIKE ' "& key &" '
2.sinin de mantığı şöyle (sintaksı kontrol edemedim):
SQL = " SELECT * FROM Tablo1 INNER JOIN Tablo2 ON [Tablo1].ID = [Tablo2].CatNo WHERE (adi='fgdfgdf' "
keyy = Split(key, " ")
For Each aranan in keyy
SQL = SQL & "OR adi LIKE '"& aranan &"' "
Next
SQL = SQL &" ")"
Rs.Open SQL, bag, 1, 3
bu SQL ifadesinin sonucu şöyle olmalı:
SQL = "SELECT .. WHERE (adi='fgdfgdf' OR adi LIKE 'Salih' OR adi LIKE 'UĞUR')"
buradaki adi='fgdfgdf' kısmı, döngü içindeki OR kısmının ifadeyi bozmaması içindir..
DotNetKid
20/02/2006, 13:42
uğraşın için tşk ederim ama;
1.si için şunu deneyebilirsin:
adi LIKE ' "& key &" '
bununla diğer dediğin arasında ne fark var anlayamadım :) yine de olmuyor.. ikinci problemde döngü başarılı ama aynı sorun yüzünden o da olmuyor.
" salih " aratınca;
SELECT * FROM Tablo1 INNER JOIN Tablo2 ON [Tablo1].ID = [Tablo2].CatNo WHERE (adi LIKE 'dfsdf' OR adi LIKE 'salih' )
" salih uğur " aratınca;
SELECT * FROM Tablo1 INNER JOIN Tablo2 ON [Tablo1].ID = [Tablo2].CatNo WHERE (adi LIKE 'dfsdf' OR adi LIKE 'salih' OR adi LIKE 'uğur' )
olarak sorguluyor.. ama yine dediğim gibi birinci sorundan dolayı sonuc getirmiyor..
" salih uğur " verisini " salih " yazınca bulacak bir çözüm yok mu :(
( Şuan da aklım geldi de acaba bunun çözümü veriyi alırken yaptıgımız gibi db de kayıtlı alandaki veriyi de eğer birden fazla kelime ise bölüp teker teker mi inceletmek lazım?)
doronty37
20/02/2006, 19:35
bununla diğer dediğin arasında ne fark var anlayamadım :)
fark şu:
1.mesajımda kod: adi LIKE '"& key &"'
2.mesajımda kod: adi LIKE ' "& key &" '
2.sinde tek tırmak ve çift tırnak arasında boşluk var. ama şuanki tahminime göre olmaz bu da.
bir de adi LIKE '% "& key &" %' şeklinde dener misin?
(% işaretiyle " işareti arasında boşluk var :) )
DotNetKid
21/02/2006, 09:21
aradaki farkı farkettim fakat denedim ve o da olmadı bir de son yazdıgınızı deneyeceğim saolun..
(bir de bir önceki sorum malesef çözüm bulmadı RegExp ile ilgili olan ilgilenirseniz sevinirim..)
DotNetKid
21/02/2006, 12:02
son yazdıgınız oldu. sorun düzeldi cok tşk ederim:
bir de adi LIKE '% "& key &" %' şeklinde dener misin?
(% işaretiyle " işareti arasında boşluk var )
(bir de bir önceki sorum malesef çözüm bulmadı RegExp ile ilgili olan ilgilenirseniz sevinirim..)
SmaRT_AleCK
24/02/2006, 16:08
5 tablo ve bu 5 tablo içindeki alanlar arasındaki bağlanıtıyı göstern sql kodu
umarım bu sql az da olsa sana fikir verir
SQL="select dosya_no,Alici.Alici,Gumruk.Gumruk,Gumruk.Gumruk_K odu,Beyan1,beyannameNo,Kur_Tarihi,KDV,Doviz.Doviz_ Kodu,FaturaBedeli1,CIFSatis,ToplamVergi,KapAdedi FROM GGBmastr,Gumruk,Alici,Doviz WHERE Gonderen_no='"& musteri &"' and (Kur_Tarihi >= '"& cdate(t1) &"') AND (Kur_Tarihi <= '"& cdate(t2) &"') AND GGBmastr.Gumruk_No=Gumruk.Gumruk_No AND GGBmastr.Beyan1 in ('IM','EU') AND GGBmastr.Alici_No=Alici.Alici_No AND GGBmastr.Doviz1=Doviz.Sira_No AND ((GGBmastr.RejimKodu='4000') or (GGBmastr.RejimKodu='4071') or (GGBmastr.RejimKodu='5100') or (GGBmastr.RejimKodu='5171') or (GGBmastr.RejimKodu='5300') or (GGBmastr.RejimKodu='5371') or (GGBmastr.RejimKodu='7100')) AND GGBmastr.Dosya_No not in(select dosya_no From syk_VergiTalep) order by dosya_no asc"
Forum Yazılımı : vBulletin v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.