MySQL-Join Kullanımında aynı Tabloyu 2-3 defa kullanma

Diğer 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ı
hi_selamlar
Üye
Mesajlar: 522
Kayıt: 05 May 2005 02:24
Konum: DelphiTürkiye.COM

MySQL-Join Kullanımında aynı Tabloyu 2-3 defa kullanma

Mesaj gönderen hi_selamlar » 24 Ara 2012 12:53

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.
Herkes cahildir, bazi konularda.

anemos
Üye
Mesajlar: 107
Kayıt: 02 Nis 2007 06:51
Konum: Sakarya / Hendek

Re: MySQL-Join Kullanımında aynı Tabloyu 2-3 defa kullanma

Mesaj gönderen anemos » 24 Ara 2012 01:05

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 = ???

Kullanıcı avatarı
hi_selamlar
Üye
Mesajlar: 522
Kayıt: 05 May 2005 02:24
Konum: DelphiTürkiye.COM

Re: MySQL-Join Kullanımında aynı Tabloyu 2-3 defa kullanma

Mesaj gönderen hi_selamlar » 24 Ara 2012 01:37

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 = ???
Teşekkür ederim...
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.

Kullanıcı avatarı
Battosai
Üye
Mesajlar: 1316
Kayıt: 30 Eyl 2007 11:02
Konum: Ankara

Re: MySQL-Join Kullanımında aynı Tabloyu 2-3 defa kullanma

Mesaj gönderen Battosai » 24 Ara 2012 04:20

mevcut tablolarınızın alanlarını ve ilişki durumlarını yazın.... sorgu çıktısı nasıl olacak ise belirtin cevap gelir.

Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: MySQL-Join Kullanımında aynı Tabloyu 2-3 defa kullanma

Mesaj gönderen vkamadan » 25 Ara 2012 09:08

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;
Volkan KAMADAN
www.polisoft.com.tr

Kullanıcı avatarı
hi_selamlar
Üye
Mesajlar: 522
Kayıt: 05 May 2005 02:24
Konum: DelphiTürkiye.COM

Re: MySQL-Join Kullanımında aynı Tabloyu 2-3 defa kullanma

Mesaj gönderen hi_selamlar » 25 Ara 2012 11:50

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;
teşekkür ederim.
kontrol edip bilgi vereceğim.

:bravo:
Herkes cahildir, bazi konularda.

Kullanıcı avatarı
hi_selamlar
Üye
Mesajlar: 522
Kayıt: 05 May 2005 02:24
Konum: DelphiTürkiye.COM

Re: MySQL-Join Kullanımında aynı Tabloyu 2-3 defa kullanma

Mesaj gönderen hi_selamlar » 27 Ara 2012 03:13

S.A.

Ü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.

Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: MySQL-Join Kullanımında aynı Tabloyu 2-3 defa kullanma

Mesaj gönderen vkamadan » 27 Ara 2012 03:26

merhaba ,

Kod: Tümünü seç

COUNT(DOLAP1.FIRMALAR_ID) AS BUTUN_DOLAPLAR,
COUNT(DOLAP2.FIRMALAR_ID) AS DEPODA_BULUNAN
şu bölümü aşağıdaki gibi değiştirip denermisiniz,

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

Kullanıcı avatarı
hi_selamlar
Üye
Mesajlar: 522
Kayıt: 05 May 2005 02:24
Konum: DelphiTürkiye.COM

Re: MySQL-Join Kullanımında aynı Tabloyu 2-3 defa kullanma

Mesaj gönderen hi_selamlar » 27 Ara 2012 03:40

S.A.
Üstadım öncelikle hızlı cevabın için teşekkür ederim.
Ama sonuç olumsuz.

Resim

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;
Ama bu şekilde yapınca sonuç doğru ama, hız düşüyor....

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;
Teşekür ederim..
Herkes cahildir, bazi konularda.

Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: MySQL-Join Kullanımında aynı Tabloyu 2-3 defa kullanma

Mesaj gönderen vkamadan » 27 Ara 2012 05:21

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.

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

Kullanıcı avatarı
hi_selamlar
Üye
Mesajlar: 522
Kayıt: 05 May 2005 02:24
Konum: DelphiTürkiye.COM

Re: MySQL-Join Kullanımında aynı Tabloyu 2-3 defa kullanma

Mesaj gönderen hi_selamlar » 28 Ara 2012 10:54

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.
Herkes cahildir, bazi konularda.

Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: MySQL-Join Kullanımında aynı Tabloyu 2-3 defa kullanma

Mesaj gönderen vkamadan » 28 Ara 2012 05:39

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.
Volkan KAMADAN
www.polisoft.com.tr

Cevapla