MySQL-Join Kullanımında aynı Tabloyu 2-3 defa kullanma
- hi_selamlar
- Üye
- Mesajlar: 523
- Kayıt: 05 May 2005 03:24
- Konum: DelphiTürkiye.COM
MySQL-Join Kullanımında aynı Tabloyu 2-3 defa kullanma
S.A.
Bütün arkadaşlarıma kolay gelsin.
BİR JOİN İÇERİSİNDE AYNI TABLOYU 2-3-4 DEFA FARKLI KRİTERLER İLE SORGUYA DAİL ETMEK İSTİYORUM.
BU İŞLEMİ YAPARKEN "ALIAS" KULLANMAMA RAĞMEN İŞLEM ÇOK AĞIR GELİYOR.
Şöyle bir sorum olacak tı ;
1 - müşteri DB (50 kayıt var)
2- girişler DB (2000 kayıt var)
öncelikle JOIN ile bütün müşteri kayıtları gelecek. (50 adet)
müşteri ye ait girişler de toplam satış kg ları geliyor. (LEFT OUTER JOIN) kullanarak sorgu çok hızlı bir şekilde geliyor.
Buraya kadar bir sorun yok.
beni istediğim ise;
aynı join içerisinde girişler DB yi bir daha sorgulayıp başka kriterler doğrultusunda tahsilat larının gelmesini istiyorum.
Bu işlemi ALIAS kullanarak yapıyorum ama sonuç 30 sn. geliyor. Çok ağır..
Bunu farklı bir çözümü veya farklı bir yönetime varmı acaba ?
Teşekkür ederim.
Saygılar. Kolay Gelsin.
Bütün arkadaşlarıma kolay gelsin.
BİR JOİN İÇERİSİNDE AYNI TABLOYU 2-3-4 DEFA FARKLI KRİTERLER İLE SORGUYA DAİL ETMEK İSTİYORUM.
BU İŞLEMİ YAPARKEN "ALIAS" KULLANMAMA RAĞMEN İŞLEM ÇOK AĞIR GELİYOR.
Şöyle bir sorum olacak tı ;
1 - müşteri DB (50 kayıt var)
2- girişler DB (2000 kayıt var)
öncelikle JOIN ile bütün müşteri kayıtları gelecek. (50 adet)
müşteri ye ait girişler de toplam satış kg ları geliyor. (LEFT OUTER JOIN) kullanarak sorgu çok hızlı bir şekilde geliyor.
Buraya kadar bir sorun yok.
beni istediğim ise;
aynı join içerisinde girişler DB yi bir daha sorgulayıp başka kriterler doğrultusunda tahsilat larının gelmesini istiyorum.
Bu işlemi ALIAS kullanarak yapıyorum ama sonuç 30 sn. geliyor. Çok ağır..
Bunu farklı bir çözümü veya farklı bir yönetime varmı acaba ?
Teşekkür ederim.
Saygılar. Kolay Gelsin.
Herkes cahildir, bazi konularda.
Re: MySQL-Join Kullanımında aynı Tabloyu 2-3 defa kullanma
Mysql hiç bilmiyorum ancak ben derived table ile aşağıdaki gibi kullanıyorum ve çok hızlı.
Kod: Tümünü seç
select *
from
(
select a.*, b.*
from müşteridb a left join girişlerdb b on (a.id = b.id)
) as tmp
where koşul = ???
- hi_selamlar
- Üye
- Mesajlar: 523
- Kayıt: 05 May 2005 03:24
- Konum: DelphiTürkiye.COM
Re: MySQL-Join Kullanımında aynı Tabloyu 2-3 defa kullanma
Teşekkür ederim...anemos yazdı:Mysql hiç bilmiyorum ancak ben derived table ile aşağıdaki gibi kullanıyorum ve çok hızlı.
Kod: Tümünü seç
select * from ( select a.*, b.* from müşteridb a left join girişlerdb b on (a.id = b.id) ) as tmp where koşul = ???
peki Girisler DB yi tekrar farklı bir kriter içinde sorguya nasıl dahil ediyorsunuz.
örneğin ;
giriler db
1. sorguda > toplam kg geliyor (belli kriterler doğrultusunda)
2. sorguda > tahsilatlar geliyor ( bu da ayrı bir kriterde)
3. sorguda > iskontolar geliyor ( bu da daha farklı bir kriterde)
...
...
n
şeklinde.
Bu işlemi nasıl gerçekleştiriyorsunuz acaba ?
Teşekkür ederim..
Herkes cahildir, bazi konularda.
Re: MySQL-Join Kullanımında aynı Tabloyu 2-3 defa kullanma
mevcut tablolarınızın alanlarını ve ilişki durumlarını yazın.... sorgu çıktısı nasıl olacak ise belirtin cevap gelir.
Re: MySQL-Join Kullanımında aynı Tabloyu 2-3 defa kullanma
merhaba ,
yüzbinlerce kayıdın olduğu sistemlerde dahi doğru indexlerle hiç bir sıkıntı çıkartmayan tabloları birden fazla defa joinleyen sorgularımdan birini doğrudan yapıştırıyorum umarım yardımcı olur.
yüzbinlerce kayıdın olduğu sistemlerde dahi doğru indexlerle hiç bir sıkıntı çıkartmayan tabloları birden fazla defa joinleyen sorgularımdan birini doğrudan yapıştırıyorum umarım yardımcı olur.
Kod: Tümünü seç
SELECT isadres.adres1 as adres1 , isadres.adres2 as adres2,CAST(isadres.postakodu as SIGNED INTEGER) as pkodu,
isadres.semt as semt, isadres.il as sehir , isadres.ilce as isilce,
istel1.telefonno as tel_no1,istel2.telefonno as tel_no2,isfaks.telefonno as faks_no,isgsm.telefonno as gsm_no , isgsm.operator as gsmoperator,
eposta1.adres as mail,
IFNULL(s.aciklama,"YOK") as subeadi, IFNULL(t.hes_ad1,"MERKEZ") as taliacente ,IFNULL(tm.hes_ad1,"YOK") as temsilciadi , IFNULL(th.hes_ad1,"YOK") as tahsildaradi,IFNULL(gh.hes_ad1,"YOK") as grupadi,
h.hes_id,h.htipadi,h.kaydurum,h.hes_kod,h.hes_ad1,h.hes_ad2,h.vergi_da,h.vergi_no,h.mhs_heskod,h.doviz_tur,h.ozel_kod,
h.bos01,h.bos02,h.bos04,h.bos05,h.dogum_tar,h.meslek,h.grup,h.temsilci,h.tahsilat,h.entegrasyon,h.tali,h.tahsildar,
h.sube,h.banka,h.mtipi,h.mut_tar,h.sektor,h.webadresi,h.firmatipi,h.ticaretsicilno,h.portfoykaynagi,h.riskgrubu,h.risknedeni,h.refadi,h.borc_tutar as aktivasyon,h.aheskod FROM hesapkart h
LEFT OUTER JOIN adrespool as isadres ON h.hes_kod=isadres.heskod and isadres.yer=0 and isadres.tip=1
LEFT OUTER JOIN telefonpool as istel1 ON h.hes_kod=istel1.heskod and istel1.yer=0 and istel1.tip=1
LEFT OUTER JOIN telefonpool as istel2 ON h.hes_kod=istel2.heskod and istel2.yer=0 and istel2.tip=2
LEFT OUTER JOIN telefonpool as isfaks ON h.hes_kod=isfaks.heskod and isfaks.yer=0 and isfaks.tip=3
LEFT OUTER JOIN telefonpool as isgsm ON h.hes_kod=isgsm.heskod and isgsm.yer=0 and isgsm.tip=4
LEFT OUTER JOIN epostapool as eposta1 ON h.hes_kod=eposta1.heskod and eposta1.yer=0 and eposta1.tip=1
LEFT OUTER JOIN sube as s ON h.sube=s.kod
LEFT OUTER JOIN hesapkart as t ON h.tali=t.hes_kod
LEFT OUTER JOIN hesapkart as tm ON h.temsilci=tm.hes_kod
LEFT OUTER JOIN hesapkart as th ON h.tahsildar=th.hes_kod
LEFT OUTER JOIN hesapkart as gh ON h.grup=gh.hes_kod;
Volkan KAMADAN
www.polisoft.com.tr
www.polisoft.com.tr
- hi_selamlar
- Üye
- Mesajlar: 523
- Kayıt: 05 May 2005 03:24
- Konum: DelphiTürkiye.COM
Re: MySQL-Join Kullanımında aynı Tabloyu 2-3 defa kullanma
teşekkür ederim.vkamadan yazdı:merhaba ,
yüzbinlerce kayıdın olduğu sistemlerde dahi doğru indexlerle hiç bir sıkıntı çıkartmayan tabloları birden fazla defa joinleyen sorgularımdan birini doğrudan yapıştırıyorum umarım yardımcı olur.
Kod: Tümünü seç
SELECT isadres.adres1 as adres1 , isadres.adres2 as adres2,CAST(isadres.postakodu as SIGNED INTEGER) as pkodu, isadres.semt as semt, isadres.il as sehir , isadres.ilce as isilce, istel1.telefonno as tel_no1,istel2.telefonno as tel_no2,isfaks.telefonno as faks_no,isgsm.telefonno as gsm_no , isgsm.operator as gsmoperator, eposta1.adres as mail, IFNULL(s.aciklama,"YOK") as subeadi, IFNULL(t.hes_ad1,"MERKEZ") as taliacente ,IFNULL(tm.hes_ad1,"YOK") as temsilciadi , IFNULL(th.hes_ad1,"YOK") as tahsildaradi,IFNULL(gh.hes_ad1,"YOK") as grupadi, h.hes_id,h.htipadi,h.kaydurum,h.hes_kod,h.hes_ad1,h.hes_ad2,h.vergi_da,h.vergi_no,h.mhs_heskod,h.doviz_tur,h.ozel_kod, h.bos01,h.bos02,h.bos04,h.bos05,h.dogum_tar,h.meslek,h.grup,h.temsilci,h.tahsilat,h.entegrasyon,h.tali,h.tahsildar, h.sube,h.banka,h.mtipi,h.mut_tar,h.sektor,h.webadresi,h.firmatipi,h.ticaretsicilno,h.portfoykaynagi,h.riskgrubu,h.risknedeni,h.refadi,h.borc_tutar as aktivasyon,h.aheskod FROM hesapkart h LEFT OUTER JOIN adrespool as isadres ON h.hes_kod=isadres.heskod and isadres.yer=0 and isadres.tip=1 LEFT OUTER JOIN telefonpool as istel1 ON h.hes_kod=istel1.heskod and istel1.yer=0 and istel1.tip=1 LEFT OUTER JOIN telefonpool as istel2 ON h.hes_kod=istel2.heskod and istel2.yer=0 and istel2.tip=2 LEFT OUTER JOIN telefonpool as isfaks ON h.hes_kod=isfaks.heskod and isfaks.yer=0 and isfaks.tip=3 LEFT OUTER JOIN telefonpool as isgsm ON h.hes_kod=isgsm.heskod and isgsm.yer=0 and isgsm.tip=4 LEFT OUTER JOIN epostapool as eposta1 ON h.hes_kod=eposta1.heskod and eposta1.yer=0 and eposta1.tip=1 LEFT OUTER JOIN sube as s ON h.sube=s.kod LEFT OUTER JOIN hesapkart as t ON h.tali=t.hes_kod LEFT OUTER JOIN hesapkart as tm ON h.temsilci=tm.hes_kod LEFT OUTER JOIN hesapkart as th ON h.tahsildar=th.hes_kod LEFT OUTER JOIN hesapkart as gh ON h.grup=gh.hes_kod;
kontrol edip bilgi vereceğim.
Herkes cahildir, bazi konularda.
- hi_selamlar
- Üye
- Mesajlar: 523
- Kayıt: 05 May 2005 03:24
- Konum: DelphiTürkiye.COM
Re: MySQL-Join Kullanımında aynı Tabloyu 2-3 defa kullanma
S.A.
Üstadım yapmama rağmen sonuçlar çok farklı çıkıyor. hatam nerede acaba ?
Üstadım yapmama rağmen sonuçlar çok farklı çıkıyor. hatam nerede acaba ?
Kod: Tümünü seç
SELECT
FIRMA.FIRMALAR_ID,
FIRMA.FIRMA_UNVANI,
COUNT(DOLAP1.FIRMALAR_ID) AS BUTUN_DOLAPLAR,
COUNT(DOLAP2.FIRMALAR_ID) AS DEPODA_BULUNAN
FROM FIRMALAR FIRMA
LEFT OUTER JOIN DOLAP AS DOLAP1 ON (DOLAP1.FIRMALAR_ID= FIRMA.FIRMALAR_ID)
LEFT OUTER JOIN DOLAP AS DOLAP2 ON (DOLAP2.FIRMALAR_ID= FIRMA.FIRMALAR_ID) AND
(DOLAP2.MUSTERI_ID<=0)
GROUP BY FIRMA.FIRMALAR_ID
ORDER BY FIRMA.FIRMALAR_ID;
Herkes cahildir, bazi konularda.
Re: MySQL-Join Kullanımında aynı Tabloyu 2-3 defa kullanma
merhaba ,
şu bölümü aşağıdaki gibi değiştirip denermisiniz,
Kod: Tümünü seç
COUNT(DOLAP1.FIRMALAR_ID) AS BUTUN_DOLAPLAR,
COUNT(DOLAP2.FIRMALAR_ID) AS DEPODA_BULUNAN
Kod: Tümünü seç
SUM(IF(IFNULL(DOLAP1.FIRMALAR_ID,0)>0,1,0)) as BUTUN_DOLAPLAR,
SUM(IF(IFNULL(DOLAP2.FIRMALAR_ID,0)>0,1,0)) as DEPODA_BULUNAN
Volkan KAMADAN
www.polisoft.com.tr
www.polisoft.com.tr
- hi_selamlar
- Üye
- Mesajlar: 523
- Kayıt: 05 May 2005 03:24
- Konum: DelphiTürkiye.COM
Re: MySQL-Join Kullanımında aynı Tabloyu 2-3 defa kullanma
S.A.
Üstadım öncelikle hızlı cevabın için teşekkür ederim.
Ama sonuç olumsuz.
Yapmak istediğim şu aslında ;
FIRMALAR DB || DOLAP DB
FIRMA_ADI | TOPLAM_DOLAP | KULLANILMAYAN | ARIZALI
AHMET | 100 ADET | 10 ADET | 2
MEHMET | 60 ADET | 5 ADET | 0
şeklinde işlem yapmak istiyorum.
Doğul olarak bunun içinde
TOPLAM_DOLAP İÇİN >> KRİTER FARKLI
KULLANILMAYAN İÇİN >> KRİTER FARKLI
ARIZA İÇİN >> KRİTER FARKLI.
ama bu kriterlerin hepsi DOLAP DB içerisinde.
Bu SQL ile yapmaya çalıştım sonuçlar örneğin : 10 ise çarpım yapıp >>> 9784 gibi bir rakam çıkarıyor.
Ama bu şekilde yapınca sonuç doğru ama, hız düşüyor....
Teşekür ederim..
Üstadım öncelikle hızlı cevabın için teşekkür ederim.
Ama sonuç olumsuz.
Yapmak istediğim şu aslında ;
FIRMALAR DB || DOLAP DB
FIRMA_ADI | TOPLAM_DOLAP | KULLANILMAYAN | ARIZALI
AHMET | 100 ADET | 10 ADET | 2
MEHMET | 60 ADET | 5 ADET | 0
şeklinde işlem yapmak istiyorum.
Doğul olarak bunun içinde
TOPLAM_DOLAP İÇİN >> KRİTER FARKLI
KULLANILMAYAN İÇİN >> KRİTER FARKLI
ARIZA İÇİN >> KRİTER FARKLI.
ama bu kriterlerin hepsi DOLAP DB içerisinde.
Bu SQL ile yapmaya çalıştım sonuçlar örneğin : 10 ise çarpım yapıp >>> 9784 gibi bir rakam çıkarıyor.
Kod: Tümünü seç
SELECT
FIRMA.FIRMALAR_ID,
FIRMA.FIRMA_UNVANI,
COUNT(DOLAP1.FIRMALAR_ID) AS BUTUN_DOLAPLAR,
COUNT(DOLAP2.FIRMALAR_ID) AS DEPODA_BULUNAN
FROM FIRMALAR FIRMA
LEFT OUTER JOIN DOLAP AS DOLAP1 ON (DOLAP1.FIRMALAR_ID= FIRMA.FIRMALAR_ID)
LEFT OUTER JOIN DOLAP AS DOLAP2 ON (DOLAP2.FIRMALAR_ID= FIRMA.FIRMALAR_ID) AND
(DOLAP2.MUSTERI_ID<=0)
GROUP BY FIRMA.FIRMALAR_ID
ORDER BY FIRMA.FIRMALAR_ID;
Kod: Tümünü seç
SELECT
FIRMALAR.FIRMALAR_ID,
FIRMALAR.FIRMA_UNVANI,
(
SELECT COUNT(DOLAP1.DOLAP_ID) FROM DOLAP DOLAP1
WHERE DOLAP1.FIRMALAR_ID= FIRMALAR.FIRMALAR_ID
) AS TOPLAM_DOLAP,
(
SELECT COUNT(DOLAP4.DOLAP_ID) FROM DOLAP DOLAP4
WHERE DOLAP4.FIRMALAR_ID= FIRMALAR.FIRMALAR_ID AND
DOLAP4.MUSTERI_ID>0
) AS KULLANILAN,
(
SELECT COUNT(DOLAP2.DOLAP_ID) FROM DOLAP DOLAP2
WHERE DOLAP2.FIRMALAR_ID= FIRMALAR.FIRMALAR_ID AND
DOLAP2.MUSTERI_ID<=0
) AS DEPODA_BULUNAN,
(
SELECT COUNT(DOLAP3.DOLAP_ID) FROM DOLAP DOLAP3
WHERE DOLAP3.FIRMALAR_ID= FIRMALAR.FIRMALAR_ID AND
DOLAP3.DOLAP_ARIZADA_MI=TRUE
) AS ARIZALI
FROM FIRMALAR
GROUP BY FIRMALAR.FIRMALAR_ID
ORDER BY FIRMALAR.FIRMALAR_ID;
Herkes cahildir, bazi konularda.
Re: MySQL-Join Kullanımında aynı Tabloyu 2-3 defa kullanma
merhaba ,
ana tablo FIRMA , detay hareket tablosuda DOLAP sa , konular bu iki tablonun ilişkisi üzerinde yürüyecekse, ilk sorgunuzu tek bir joinle aşadağıi gibi düzenleyebilirsiniz.
ana tablo FIRMA , detay hareket tablosuda DOLAP sa , konular bu iki tablonun ilişkisi üzerinde yürüyecekse, ilk sorgunuzu tek bir joinle aşadağıi gibi düzenleyebilirsiniz.
Kod: Tümünü seç
SELECT
FIRMA.FIRMALAR_ID,
FIRMA.FIRMA_UNVANI,
SUM(1) AS BUTUN_DOLAPLAR ,
SUM(IF(DOLAP.MUSTERI_ID<=0,1,0)) AS DEPODA_BULUNAN
FROM FIRMALAR FIRMA
LEFT OUTER JOIN DOLAP ON (DOLAP.FIRMALAR_ID= FIRMA.FIRMALAR_ID)
GROUP BY FIRMA.FIRMALAR_ID
ORDER BY FIRMA.FIRMALAR_ID;
Volkan KAMADAN
www.polisoft.com.tr
www.polisoft.com.tr
- hi_selamlar
- Üye
- Mesajlar: 523
- Kayıt: 05 May 2005 03:24
- Konum: DelphiTürkiye.COM
Re: MySQL-Join Kullanımında aynı Tabloyu 2-3 defa kullanma
Hocam ilginiz için teşekkür ederim.
Bu şekilde sonuçlar doğru dönüyor.
2 sorum olacaktı izninizle ;
1- hangi sorgu sizce daha hızlı ? | sizin verdiğiniz --- benim daha önce yaptığım SubQuery
2- neden aynı tabloyu join içerisinde kullanamadım ?
teşekkürler.
Bu şekilde sonuçlar doğru dönüyor.
2 sorum olacaktı izninizle ;
1- hangi sorgu sizce daha hızlı ? | sizin verdiğiniz --- benim daha önce yaptığım SubQuery
2- neden aynı tabloyu join içerisinde kullanamadım ?
teşekkürler.
Herkes cahildir, bazi konularda.
Re: MySQL-Join Kullanımında aynı Tabloyu 2-3 defa kullanma
Merhaba ,
1- hangi sorgu sizce daha hızlı ? | sizin verdiğiniz --- benim daha önce yaptığım SubQuery
Benim verdiğim daha hızlı olur, hızı kayıt adetleri arttığında fark edersiniz, çünkü ana tablonun yanına iliştirilmiş tek bir tablo var ve indexli olduğunu düşündüğüm tek bir alanla ilişkili. subquery lerin performans yönünden gerçekten mecbur olmadıkça kullanmaması gereken yapılar olduğunu düşünüyorum,
2- neden aynı tabloyu join içerisinde kullanamadım ?
Aynı tabloyu biden fazla defa joinleme şuanki amacınıza uygun değil , çift joinli yapınızda başınıza gelen şu , eğer bir firmanın DEPODA_BULUNAN değeri sıfırdan büyük çıkacaksa hem tüm , hemde depoda bulunan değerleri aynı gelir, diğer durumda sacece tüm değeri gelir ,nedeni eğer ilgili kayıt her iki durum içinde mevcutsa kritere uyan kayıt adedi kadar 2 ile çarpılıp gelir, örneğin depoda olan normalde 5 ise, toplam da 15 ise , depoda olanın önemi olmadan toplam kayıt adedi her iki durum içinde listelenir ve toplamı olan 30 değeri gelir.
1- hangi sorgu sizce daha hızlı ? | sizin verdiğiniz --- benim daha önce yaptığım SubQuery
Benim verdiğim daha hızlı olur, hızı kayıt adetleri arttığında fark edersiniz, çünkü ana tablonun yanına iliştirilmiş tek bir tablo var ve indexli olduğunu düşündüğüm tek bir alanla ilişkili. subquery lerin performans yönünden gerçekten mecbur olmadıkça kullanmaması gereken yapılar olduğunu düşünüyorum,
2- neden aynı tabloyu join içerisinde kullanamadım ?
Aynı tabloyu biden fazla defa joinleme şuanki amacınıza uygun değil , çift joinli yapınızda başınıza gelen şu , eğer bir firmanın DEPODA_BULUNAN değeri sıfırdan büyük çıkacaksa hem tüm , hemde depoda bulunan değerleri aynı gelir, diğer durumda sacece tüm değeri gelir ,nedeni eğer ilgili kayıt her iki durum içinde mevcutsa kritere uyan kayıt adedi kadar 2 ile çarpılıp gelir, örneğin depoda olan normalde 5 ise, toplam da 15 ise , depoda olanın önemi olmadan toplam kayıt adedi her iki durum içinde listelenir ve toplamı olan 30 değeri gelir.
Volkan KAMADAN
www.polisoft.com.tr
www.polisoft.com.tr