Zoque.Forum
»
Inner Join veya benzeri bir SQL ilişkisi Nasıl ?
|
| Veritabanları MySQL , MSSQL, SQL, Access, Oracle |
![]() |
|
|
LinkBack | Seçenekler |
|
|
#1 (permalink) |
|
Üyelik Tarihi: 13.07.2000
Yer: LND
Mesaj: 4,268
|
Inner Join veya benzeri bir SQL ilişkisi Nasıl ?
Durum şu iki tane tablom var bunlar bir tanesi e-mail adreslerini tutuyor bir ikincisi de mailların email adreslerine gittiğini not alıyor;
+ list ---------------------- - list_id - email (e-mail adresi) +checksend --------------------- - checksend_id - list_id (list tablosundaki list_id ile ilişkili) - mail_id (gönderilen e-mailin numarası bu diğer bir tabloda tutuluyor) E-maillar gönderilirken her gönderimden sonra bunu checksend' e list_id ile kaydediyorum. Dolayısıyla yarın bir gün aynı mesajı göndermek isteyince aynı kişilere göndermemiş oalcak. Öyle bir SQL yazmalıyım ki "list.list_id" "checksend.list_id" de olmayan e-mail adreslerini seçmeliyim ? Nasıl yazabileceğim hakkında fikri olan var mı ?
__________________
FERRUH.MAVİTUNA - Okuduklarim You are not your fu*@.' khakis, wait a minute maybe you are... |
|
|
|
|
|
#3 (permalink) |
|
Üyelik Tarihi: 13.07.2000
Yer: LND
Mesaj: 4,268
|
ifade çalışmıyor.
"!=" ile eşit olmamasını belli etmek istiyorsun sanıyorum bunun yerine o anlama gelen "<>" kullandım ancak bu da benim denediğime çıkıyor zaten iki tablodan da kayıt çektiğinden aynı kaydı tekrar tekrar getiriyor dolayısıyla ilk tablo kayıt sayısı * ikinci tablo kayıt sayısı kadar kayıt dönüyor bu da benim örneğimde 70.000 küsüre tekabül ediyor. Yani başka şekilde mantık kurmak gerekiyor sanıyorum.
__________________
FERRUH.MAVİTUNA - Okuduklarim You are not your fu*@.' khakis, wait a minute maybe you are... |
|
|
|
|
|
#4 (permalink) |
|
SELECT DISTINCT list.email from list,checksend where list.list_id <> checksend.list_id;
Böyle yazarsan herhalde tekrarlanan satırları almazsın ![]()
__________________
St. Nonstop Elektronik ve Haberleşme Mühendisi Aziz DURMAZ Mesaj stNonStop tarafından 12.12.2002 (00:41) yeniden düzenlendi.. |
|
|
|
|
|
|
#5 (permalink) |
|
Ufak bir düzeltme
Eğerki yanlış anlamadıysa birden fazla msg var ve sen bunları sıra ile yollamıyorsun kişilerin bir bölümüne 1. msg yi diğer bölümüne 2. msg yi diye devam ediyor.
Ve Sen email adreslerine aynı msgnin ikinci kez gitmesini istemiyorsun. Bence bu sorgumuza birde SELECT DISTINCT list.email from list,checksend where list.list_id <> checksend.list_id AND checksend.mail_id='xxxx'; Şekline getirmen daha mantıklı bu sayede xxxx değişkenin bağlı mail id sinin hangi email adreslerine gitmediğini bulursun. Hatta bu seferde DISTINCT te dahi ihtiyaç duymazsın gibime geliyor.
__________________
St. Nonstop Elektronik ve Haberleşme Mühendisi Aziz DURMAZ |
|
|
|
|
|
|
#6 (permalink) |
|
Üyelik Tarihi: 13.07.2000
Yer: LND
Mesaj: 4,268
|
DISTINCT kullanımını buradaki SQL de bir şey ifade etmiyor ayı kayıtları almadığı kesin ancak çapraz şekilde iki tyablodan kayıt çekildiğinden dolayı sonuç DISTINCT ile de olsa yanlış dönüyor (daha doğrusu bizim istediğimiz dönmüyor)
Şu an tüm maillar dönüyor checksend işe yaramıyor. "AND mail_id = 5 " kısmı benim de aklımda da soruyu iyice bulandırmayayım diye hiç yazmamıştım. Başka fikirleri olanları bekliyorum...
__________________
FERRUH.MAVİTUNA - Okuduklarim You are not your fu*@.' khakis, wait a minute maybe you are... |
|
|
|
|
|
#8 (permalink) |
|
Üyelik Tarihi: 13.07.2000
Yer: LND
Mesaj: 4,268
|
SQL server ve Access ta da DISTINCT geçiyor ancak sorun o değil iki tablodan çekim yaparken "list.list_id <> checksend.list_id" yazılmasına rağmen tüm kayıtlar dönüyor.
İki tablodan bu tip bir çekim yaparsan dönen yanlış olur çünkü; Mesela list.list_id 50 olsun. ilk kayıt için checksend' e bakıyor. karşısına checksend.list_id' 25 olarak çıkıyor ne olutyor hemen bu kayıt geçiyor halbyuki biizm istediğimizde tüm tablıoyu kontrol etmeliydi. SQL çalışırken tüm tabloyu bu şekilde kontrol eder dolayısıyla bu SQL cümleciğinden istediğimiz sonucu alamayız. İşte bu yüzden buraya yazdım ![]() Mesela checksend tablosunda sadece tek kayıtr olsun list_id' side 25 olsun bu sefer mailları listelerken 25 nolu id yi bulamayız. Çünkü tek kayıt vardır ve bunu kontrol ettiğinde öbür taraftada görür ve bunu döndürmez.. Şimdi bir fikri olan varsa bekliyorum...
__________________
FERRUH.MAVİTUNA - Okuduklarim You are not your fu*@.' khakis, wait a minute maybe you are... |
|
|
|
|
|
#9 (permalink) |
|
Soul baba msg_ID işin içine katmadan olmaz gibime geliyor çünkü buradaki kriterimiz maillerimiz yani aynı mail bir ikişe iki defa gitmiyecek.
SQL de mantıken tüm satırları kontrol ettiği için aralığı bizim daraltmamız gerekir. Bunuda ancak her msg_ID için ayrı ayrı sorgu yaparak ve onları ayrı ayrı işlemlerden gçirip normal bir dizi yerine çok indekli bir diziye açılması gerekir... Bunuda while dönünleri içerisinde yaparabiliriz. İlk while döngüsü msg_id lerini döndürecek, ikinci wihle döngüsünde sorgulardan gelen record setleri diziye açarak yapabiliriz... $_arraySorguDizisi[$msg_ID][$x] şekilde bir dizimiz olur bu sayede tek değişken dizisinde tüm bilgilerimizi tutarız gibime geliyor...
__________________
St. Nonstop Elektronik ve Haberleşme Mühendisi Aziz DURMAZ |
|
|
|
|
|
|
#10 (permalink) |
|
Üyelik Tarihi: 13.07.2000
Yer: LND
Mesaj: 4,268
|
bunu while döngüsünde yapmak zaten mevzu bahis değil çok kolay bir olay benim istediim bunu SQL ile döndürmek bu tip bir çözüm arıyorum.
Aksi takdirde çok ciddi bir performans kaybı oluşuyor.
__________________
FERRUH.MAVİTUNA - Okuduklarim You are not your fu*@.' khakis, wait a minute maybe you are... |
|
|
|
Zoque'a hoşgeldiniz!