INNER JOIN hakkında

Gecekule

Öğrenci
Katılım
7 Ocak 2015
Mesajlar
39
Reaksiyon puanı
1
Puanları
8
Merhaba,

PHP:
tablo1 adından bir tablom var
tablo1_id | sütun_a | sütun_b | diye devam ediyor
...............
..................
tablo1 de çok satırlar var


tablo2 adında ikinci tablom var
tablo2_id | sütun_1 | diye iki sütun var
    1     |    5    |

tablo2 de sadece bir satır var her zaman
NOT: tablo2 de sadece bir satır var her zaman
Sorum şu:
tablo1 de veri çekmek istediğim satırın ID numarası tablo2 de sütun_1 deki 5 ID numarasıdır
Bunu INNER JOIN ile yapılıyor ama bir türlü yapamadım yardımcı olabilir misiniz?
 

errno

Doçent
Katılım
17 Temmuz 2016
Mesajlar
694
Reaksiyon puanı
568
Puanları
93
Merhaba,

İstediğiniz işlemi yapan kodlar aşağıdadır. Ancak SQL veri tabanı sistemi içerisinde kullanım amacına göre sadece inner join değil 5 arklı join yöntemleride vardır. Amacınıza göre kullanım yapmak size kalmış.

select * from tablo1 T1
inner join table2 T2
on T1.tablo1_id=T2.sütun_1

Eleştiri anlamında algılamayın ancak sadece 1 satırlık bir tablo ile verilerin yoğun olduğu bir tablonun bağlanması biraz garip geldi. Örnek olarak siz tablo1'den veri çekerken her zaman inner join ile bağlı bir sorgu çalıştıracaksınız. Bunun yerine tablo2'yi referans gösterseniz nasıl olur ? En azından inner join yerine hem giriş güvenliğini sağlamış olursunuz hem de alan kontrolünü aynı zamanda otomatik olarak yapmış olursunuz. Ekstradan yazılmış bağlı bir tablo sorgusu çalıştırmazsınız.

Untitled.png


Bu şemada Users tablosundan UserStatus tablosuna many-to-one (çoka bir/bire çok) bağlantı tipi vardır. Users.onlineStatus kolonundan UserStatus.statusID kolonuna bağlanmıştır. Users.onlineStatus int veri tipintedir ve Users.onlineStatus içerisinde bulunmayan bir status dışarıdan eklenemez veya yanlışlık yapılmasına müsaade etmez (otomatik kontrol). int veri tipindeki Users.onlineStatus sorgulanması string veri tipine ve inner join ile bağlanmış bir tabloya göre daha hızlıdır diyebiliriz.

Yabancı anahtarımız : Users.onlineStatus
Birincil anahtarımız : Users.statusID

Ayrıca referans olarak kullanmak isterseniz bu adese bakabilirsiniz : SQL Tutorial
Eğer gelişmiş ve biraz daha üst düzeye hitap edebilecek bir veri tabanı geliştirmek için örnekler bakıyorsanız : Database Answers Home Page

internet adreslerine bakmanızı tavsiye edebilirim.

Saygılarımla
 

arsenik

Rektör
Katılım
8 Ağustos 2009
Mesajlar
11,349
Reaksiyon puanı
242
Puanları
243
Users.onlineStatus kolonundan UserStatus.statusID kolonuna bağlanmıştır.
Şu cümleyi okuyunca fk statusid sandım ama sonraki cümlede onun pk olduğu açıklanmış.

Gerçi bu yorumu yazarken pk anahtar logosunu almış statusid nin fk olmayacığını da fark ettim. :)
 

Gecekule

Öğrenci
Katılım
7 Ocak 2015
Mesajlar
39
Reaksiyon puanı
1
Puanları
8
Merhaba,

İstediğiniz işlemi yapan kodlar aşağıdadır. Ancak SQL veri tabanı sistemi içerisinde kullanım amacına göre sadece inner join değil 5 arklı join yöntemleride vardır. Amacınıza göre kullanım yapmak size kalmış.

select * from tablo1 T1
inner join table2 T2
on T1.tablo1_id=T2.sütun_1

Eleştiri anlamında algılamayın ancak sadece 1 satırlık bir tablo ile verilerin yoğun olduğu bir tablonun bağlanması biraz garip geldi. Örnek olarak siz tablo1'den veri çekerken her zaman inner join ile bağlı bir sorgu çalıştıracaksınız. Bunun yerine tablo2'yi referans gösterseniz nasıl olur ? En azından inner join yerine hem giriş güvenliğini sağlamış olursunuz hem de alan kontrolünü aynı zamanda otomatik olarak yapmış olursunuz. Ekstradan yazılmış bağlı bir tablo sorgusu çalıştırmazsınız.

Ekli dosyayı görüntüle 17635

Bu şemada Users tablosundan UserStatus tablosuna many-to-one (çoka bir/bire çok) bağlantı tipi vardır. Users.onlineStatus kolonundan UserStatus.statusID kolonuna bağlanmıştır. Users.onlineStatus int veri tipintedir ve Users.onlineStatus içerisinde bulunmayan bir status dışarıdan eklenemez veya yanlışlık yapılmasına müsaade etmez (otomatik kontrol). int veri tipindeki Users.onlineStatus sorgulanması string veri tipine ve inner join ile bağlanmış bir tabloya göre daha hızlıdır diyebiliriz.

Yabancı anahtarımız : Users.onlineStatus
Birincil anahtarımız : Users.statusID

Ayrıca referans olarak kullanmak isterseniz bu adese bakabilirsiniz : SQL Tutorial
Eğer gelişmiş ve biraz daha üst düzeye hitap edebilecek bir veri tabanı geliştirmek için örnekler bakıyorsanız : Database Answers Home Page

internet adreslerine bakmanızı tavsiye edebilirim.

Saygılarımla
Cevap için teşekkür ederim,
Ben acemiyim kendim için bir şeyler yapmaya çalışıyorum

Referans olayı önemli değil, benim istediğim TABLO1 deki sadece bir satırın bir sütununda ki veriyi almak olacak
Hangi satırın verisini alacağımı TABLO2 de sütun_1 deki ID söylecek
TABLO2 deki ID 1 sabittir değişmiyor sadece sütun_1 deki değer değişiyor

Buna göre öneriniz nedir?
 

errno

Doçent
Katılım
17 Temmuz 2016
Mesajlar
694
Reaksiyon puanı
568
Puanları
93
Merhaba,

acemilik değil bu. Çünkü işe başlamanız bile işin yarısını geçtiğini gösterir. Demek ki yapabileceğinize inanmışsınız, bu çok güzel..

Aşağıdaki tablo tasarımı ve şemada bağlı olmadan, sorguda bağladığınız bu iki tablo için iki adet örnek var. Tablo1'de 5 adet veri var ve Tablo2'de sutun_1 içinde üç adet tablo1_id'lerini tutan veriler var. Aşağıdaki resim hem sorguları, hem tablo tasarımlarını, hemde verileri göstermektedir, inceleyiniz.

inner_join_sample.png



"NOT: tablo2 de sadece bir satır var her zaman" yazınızda demek istediğinizi anlayamadım. Ama sanıyorum ki, Tablo1'deki verilere ait id içeriği sadece Tablo2 de bir tane satır olarak saklanıyor/depolanıyor veya denk geliyor demek istediniz..?

O zaman diyelim ki bu şekilde benim bir önceki örnekte dediğim gibi, yani; bire çok/çoka bir bir ilişki sistemi içerisindeki örnek resimde aşağıdadır. Bu örnekte left outer join kullanılmıştır. Yani sol taraf değerlerinin hepsi gelirken (Tablo2) sağ taraf değerlerinin (Tablo1) buna uyan kayıtların (olan verilerin ve uyanların) listesi gelmiş olacaktır. Hemen örneğimizi inceliyoruz. Evet yanlış okumadınız. Bu sefer sol taraf değerimiz/objemiz Tablo2 ve left outer join ile bağladığımız değer/objemiz ise Tablo1. Çünkü kayıtların Tablo2 de tekrar etmediği senaryosu üzerinde duruyoruz.

left_outer_join.png



Yukarıdaki örneklerin dışında farklı alternatif olarak; ayrı bir tabloda o verileri tutmak yerine aynı tabloda tutup yine bir ilişki sağlarsanız da sizin için hem sorguda hem de temel ilişki sistemine uygunluk sağlamış olabiliriz. Örnek olarak Tablo2.sutun_1 kolonunu Tablo1 içerisine taşıyalım. Bu tablodaki yabancı anahtarımız Tablo1.sutun_1 ve birinci anahtarımız ise Tablo1.tablo1_id olmalıdır. Aşağıdaki resimde hem sorguları, hem tablo tasarımlarını, hemde verileri görebilirsiniz, inceleyiniz.

own_referance.png


Alternatifler bu şekilde. İstediğinizi seçip kendi database sisteminize uygulayabilirsiniz. Kitap desteği veya internet üzerinden ilişki türleri üzerinde durmanızı tavsiye ederim. Aynı şekilde bende sürekli bakıyor ve inceliyorum bu konuları. Teknoloji her zaman gelişiyor..

Saygılarımla
 

Gecekule

Öğrenci
Katılım
7 Ocak 2015
Mesajlar
39
Reaksiyon puanı
1
Puanları
8
Çok teşekkür ederim, önerinize göre LEFT OUTER JOIN kullandım
Tablo2 hep tek satırdır, bu satır varsayılan seçimler yapıldığında tablo1 in ID sini güncelliyor

Sayenizde sorunu çözdüm çalışıyor sorun yok, ancak bir şey merak ettim T1 ve T2 niçin kullandınız? bunun yerine tablo adlarını kullansak olmaz mı?

Birde
tablo 2 için bir sorgu yazıp ID yi aldık
tablo 1 içinde bir sorgu yazıp tablo 2 den gelen ID ile burada sorgu yaptık
Hangisi daha iyidir?
Bu mu? LEFT OUTER JOIN mi?
 
Son düzenleme:

errno

Doçent
Katılım
17 Temmuz 2016
Mesajlar
694
Reaksiyon puanı
568
Puanları
93
Merhaba,

ilk olarak tabii ki tablo adları da kullanılabilirdi ancak okunabilirlik ve kullanılabilirlik açısından programlama da esas olanı yapmanın her zaman avantajları vardır. Uzun ifadeler yerine takma isimler (alias) kullanmak gibi.

Ne kadar büyük bir proje, ne kadar sıklıkla kullanılan bir tablo, ileride değişme ihtimalinin olup olmaması gibi etkenler veya daha farklı faktörler göz önünde bulundurulmalıdır son sorunuz için. Mesela Tablo2 için ileride; "bir sütun daha ekleyeceğim ve o sütunuda birincil anahtar olarak ayarlayacağım, ardından başka bir tabloya da çok'a çok ilişki için bağlama ihtimalim olabilir" derseniz; inner join ile kullanmanızda fayda var.

"Yok sadece benim istediğim gibi kesin olarak kalıcak, ileride değişme ihtimali çok düşük" derseniz, left outer join kullanımını veya kendi kendine referans'ı önerebilirim.

Bu iki önerim size göre yanlış olabilir, çünkü arka planda çalışan veritabanı kadar ön planda çalışan GUI'nin de bir çok fonksiyonu var burda. Dolayısıyla görmediğim ve projeniz hakkında bilgi sahibi olmadığım için sizi yanlış yönlendirmek istemem. Buna örnek olarak; siz left outer join'i kullanmak istersiniz ama ortak olup da null içersen satırlarıda görmek isteyebilirsiniz, çünkü GUI tarafında null olan Id için kullanıcıya mesaj verme ihtiyacı hissedebilirsiniz. Ancak bu işlem için Tablo adlarını yer değiştirmek zorundasınız. Eğer yer değiştirirseniz bu sefer sorgunun yapısı ve sonuç kümesi değişeceğinden inner join kullanabilirsiniz, çünkü hedefimiz farklıydı anca şimdi başka bir yöne doğru hedef değiştirdik.. Bu ve bunun gibi örnekler çoğaltılabilir. Son olarak, projenizi, veritabanı yapılarınızı ve veritabanı dizaynlarınızı gözden geçirip en iyi sonucu siz çıkarabileceğinizi düşünüyorum ki bu en doğru olan seçim.

Saygılarımla
 

Gecekule

Öğrenci
Katılım
7 Ocak 2015
Mesajlar
39
Reaksiyon puanı
1
Puanları
8
Bilgilendirme için çok teşekkür ederim

Benim mesleğim bina elektronik sistemleri uydun anten, güvenlik kamera, yangın ihbar, hgs ve plaka okuma, görüntülü kapı konuşma sistemleri işi yapıyorum ama php ye meraklıyım

Forumlardan yardım ala ala bir script yazmaya çalıştım apartmanlara çanak anten sistemi fiyat teklifi çıkaran bir script www.antenfiyati.com
Burada şöyle sql sorgu kullandım
PHP:
          $multifocus_canaktipi=$mysqlibag->query("
          SELECT
          canaklar.id,
          canaklar.canak_markasi,
          canaklar.canak_tipi,
          canaklar.canak_boyutu,
          canaklar.canak_fiyati,
          canaklar.canak_para_birimi,
          canaklar.stok,
          markalar.urun_markasi 
          FROM canaklar
          INNER JOIN markalar ON canaklar.canak_markasi = markalar.id         
          WHERE canaklar.canak_tipi='Multifocus' AND canaklar.stok='1'");
Bu sorguda tüm bilgileri çanaklar tablosundan alıyor, canaklar.canak_markasi alanında markanın ID si var bu ID kullanarak markalardan marka adını çekiyor.
Zaman zaman değişme ihtimali olmazsa da yarın ne getirir tabi ki bilinmez.
 
Üst