iki tabloda birbiri ile ilişkili kayıtları listelerken tek sorgu kullanmak istediğimizde kullanacağımız yöntemin başında inner join gelir.

inner join ifadesi ile iki tablodaki belirtilen sütunların sadece eşleşen kayıtları gelir. Yani bir tarafta olup diğer tarafta karşılığı olmayan kayıtlar sonuca gelmez.

inner join ifadesi yerine sadece join de yazılabilir, ikisi de aynı işi yapar.

Daha önce join yazımda neden tablo birleştirmeye ihtiyaç duyduğumuzu anlatmıştım. Fazla bi açıklama yapmadan doğrudan örneklemeye geçelim.

iki tablodaki ortak olan kayıtları listeleyen inner join sorgusu ( select * - tüm alanları seçme)

kullanıcılar tablosu

tüm kullanıcıları içeren tablomuz
tüm kursları içeren tablomuz

kullanici tablosunda her kullanıcının kurs_id alanı var ve bu alan kurs tablosundaki id alanını gösteriyor. İşte iki tabloyu birbirine bağlayan alanlarımız bunlar.

select * from kullanici inner join kurs on kullanici.kurs_id=kurs.id

sorgumuzu okuyacak olursak; kullanici tablosunu kurs tablosu ile birleştir, birleştirirken de kullanicinin kurs_id değeri ile kursun id değeri aynı olanları getir demiş oluyoruz. on ifadesinden sonra yazılan kısım birleştirme şartımızdır.

inner join sorgusu sonucunda seçilen verilerimiz

Burada dikkat ederseniz kursu olmayan yada kurs tablosunda karşılığı bulunmayan kullanıcılar listede yok. inner join in en önemli özelliği de budur, sadece iki tarafta da eşleşen kayıtları getirir.

php içerisinde kullanmak istediğimizde ise aşağıdaki kod bloğunu yazmamız gerekir.

<?php
$sorgu = $pdo->query("select * from kullanici inner join kurs on kullanici.kurs_id=kurs.id");
$kullanicilar = $sorgu->fetchAll(PDO::FETCH_OBJ);

foreach ($kullanicilar as $kullanici) {

echo "Kullanıcı Adı :: ". $kullanici->ad ."<br />";

echo "Kurs Adı :: ". $kullanici->kurs_ad ."<br />";

}

/*
çıktısı

Kullanıcı Adı :: Mustafa Yılmaz
Kurs Adı :: php
...
...
...
*/

Gördüğünüz gibi iki ayrı sorgu yazmak yerine tek sorgu ile hem kullanıcı adını hem de kurs adını aldık. (pdo bağlantısının nasıl yapıldığını bilmiyorsanız buradaki yazıma göz atabilirsiniz.)

eğer sorgumuzu

select
kullanici.id,kullanici.ad,kullanici.kurs_id,kurs.kurs_ad
from
kullanici inner join kurs
on
kullanici.kurs_id=kurs.id

kodları ile değiştirirsek.
sadece seçtiğimiz kolonları getirir.

inner join ile sadece seçtiğimiz kolonların listesi

Kolonları tek tek yazarken tablo adını başına yazmayı unutmayın. Çünkü iki tabloda da id gibi aynı isimde kolonlar olabilir ve bu durumda MySQL hangi tablonun kolonunu istediğinizi anlayamaz, hata verir.

Eşleşmeyen kayıtları da görmek isterseniz left join ve right join yazılarıma göz atabilirsiniz.