|
Yazan
|
Konu: 4 Tablo birleştirme (Bağımsız olarak) (Okunma Sayısı 488 defa)
|
|
tiamat
|
Merhaba arkadaşlar. 4 tablom var.
Birincisi ana tablo. Birinci tablo --------------------------------------------- Tablo a --------------------------------------------- a_id INT PK AI b_id INT c_id INT d_id INT adi VARCHAR falan VARCHAR filan VARCHAR ---------------------------------------------
İkinci tablo birinci tabloyla ilişkili bir tablo İkinci tablo --------------------------------------------- Tablo b --------------------------------------------- b_id INT PK AI adi VARCHAR ---------------------------------------------
Üçüncü tablo birinci tabloyla ilişkili bir tablo Üçüncü tablo --------------------------------------------- Tablo c --------------------------------------------- c_id INT PK AI adi VARCHAR ---------------------------------------------
Dödüncü tablo birinci tabloyla ilişkili bir tablo Dödüncü tablo --------------------------------------------- Tablo d --------------------------------------------- d_id INT PK AI adi VARCHAR ---------------------------------------------
Şimdi Görüldüğü üzere ben bu 4 tabloyu birden bir sorguda çekmek isiyorum. Benim oluşturduğum aşağıdaki sorguda dönen sonuç istediğim gibi yani bana bir adet sonuç döndürüyo. Fakat sorgudaki b.b_id / c.c_id / d.d_id değerlerinden bir tanesinin değeri (a) tablosunda 0 ya da null olunca bana hiç bir değer döndürmüyor. Sorgudaki parantez içerisindeki AND ifadesinin yerine OR kullandığımda ise biden fazla kayıt döndürüyor.
SELECT a.*, b.*, c.*, d.* FROM a, b, c, d WHERE ( a.b_id = b.b_id AND a.c_id = c.c_id AND a.d_id = d.d_id ) AND a.a_id = 1
Umarım sorun anlaşılmıştır. Şimdiden Teşekkürler
|
|
|
|
|
Logged
|
Tuvalete oturmadan önce, Musluğunu kontrol et bence
|
|
|
|
aziz
|
SELECT a.*, b.*, c.*, d.* FROM a, b, c, d WHERE ( a.b_id = b.b_id AND a.c_id = c.c_id AND a.d_id = d.d_id ) AND a.a_id = 1 Şu şekilde daha doğru olmaz mı? SELECT a.*, b.*, c.*, d.* FROM a, b, c, d WHERE a.a_id = `1` AND a.b_id = b.b_id AND a.c_id = c.c_id AND a.d_id = d.d_id
|
|
|
|
|
Logged
|
|
|
|
engin
Admin
Offline
Mesaj Sayısı: 496
|
SELECT a.*, b.*, c.*, d.* FROM a, b, c, d WHERE ( a.b_id = b.b_id AND a.c_id = c.c_id AND a.d_id = d.d_id ) AND a.a_id = 1 Şu şekilde daha doğru olmaz mı? SELECT a.*, b.*, c.*, d.* FROM a, b, c, d WHERE a.a_id = `1` AND a.b_id = b.b_id AND a.c_id = c.c_id AND a.d_id = d.d_id
bu iki sorgu arasında fark var mı?  Şimdi Görüldüğü üzere ben bu 4 tabloyu birden bir sorguda çekmek isiyorum. Benim oluşturduğum aşağıdaki sorguda dönen sonuç istediğim gibi yani bana bir adet sonuç döndürüyo. Fakat sorgudaki b.b_id / c.c_id / d.d_id değerlerinden bir tanesinin değeri (a) tablosunda 0 ya da null olunca bana hiç bir değer döndürmüyor. Sorgudaki parantez içerisindeki AND ifadesinin yerine OR kullandığımda ise biden fazla kayıt döndürüyor.
yazdığınız sorgu where ifadesinden sonraki tüm koşulların sağlandığında sonuç döndürür ancak join kullanmış olsaydınız ilk önce ana tablonuz seçilir sonra diğer tablolar, eğer on ile belirttiğiniz koşulları sağlayan sonuç varsa, sonuçlarla birleştirilir, sonuç yoksa herbir kolon için varsayılan değer veya null olur
|
|
|
|
|
Logged
|
Engin Dumlu engin ~ turk-php.com achilles ~ member.turk-php.com
|
|
|
|
tiamat
|
Yani join mi kullanmam gerek sonuc olabilmesi için.
|
|
|
|
|
Logged
|
Tuvalete oturmadan önce, Musluğunu kontrol et bence
|
|
|
engin
Admin
Offline
Mesaj Sayısı: 496
|
deneyip görmek lazım 
|
|
|
|
|
Logged
|
Engin Dumlu engin ~ turk-php.com achilles ~ member.turk-php.com
|
|
|
|
aziz
|
Ok... Açıklayıcı bir kod koymayı uygun gördüm. İnceleyip neler olduğunu anlamaya çalışabilirsiniz... Tablolar :# tablo 1 CREATE TABLE `tablo_a` ( `a_id` int(3) unsigned NOT NULL auto_increment, `b_id` int(3) NOT NULL, `c_id` int(3) NOT NULL, `d_id` int(3) NOT NULL, `adi` varchar(50) NOT NULL, `falan` varchar(50) NOT NULL, `filan` varchar(50) NOT NULL, PRIMARY KEY (`a_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
# tablo 2 CREATE TABLE `tablo_b` ( `b_id` int(3) unsigned NOT NULL auto_increment, `adi` varchar(50) NOT NULL, PRIMARY KEY (`b_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
# tablo 3 CREATE TABLE `tablo_c` ( `c_id` int(3) unsigned NOT NULL auto_increment, `adi` varchar(50) NOT NULL, PRIMARY KEY (`c_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
# tablo 4 CREATE TABLE `tablo_d` ( `d_id` int(3) unsigned NOT NULL auto_increment, `adi` varchar(50) NOT NULL, PRIMARY KEY (`d_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Şimdi bu tablolara 2 satır veri ekleyin.... hızlı olsun manual ekleyin... Şimdi PHP koduna bakalım...<?php $mysqli = @new mysqli("localhost", "root", "", "test");
if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); }
$query = "SELECT * FROM tablo_a JOIN (tablo_b, tablo_c, tablo_d) ON tablo_a.a_id = '1' AND tablo_a.b_id = tablo_b.b_id AND tablo_a.c_id = tablo_c.c_id AND tablo_a.d_id = tablo_d.d_id";
$result = $mysqli->query($query);
if(!$result){ printf("Errormessage: %s <br>\n", $mysqli->error); exit(); }
$field_nmb = $result->field_count; echo $field_nmb ."<br>\n";
$field_nms = $result->fetch_fields(); //print_r($field_nms);
for ($i=0; $i < $field_nmb; $i++) { echo $field_nms[$i]->name ." | "; }
echo "<br>\n";
$row = $result->fetch_array(MYSQLI_NUM); printf ("%s | (%s) | %s | (%s) | %s | (%s) | %s | (%s) | %s | (%s) | %s | (%s) | %s | <br>\n", $row[0], $row[1], $row[2], $row[3], $row[4], $row[5], $row[6], $row[7], $row[8], $row[9], $row[10], $row[11], $row[12], $row[13]);
$result->close();
$mysqli->close(); ?>
Evet, eğer kontrol ettiyseniz göreceksiniz ki JOIN içerisine koyacağınız tablo ve iptal edeceğiniz $query satırı : (örneğin => )JOIN (tablo_b, tablo_d) .... #tablo_a.c_id = tablo_c.c_id AND güzel bir template yapı oluşturuyor. tablo_a sabit olmak üzere, istediğimiz tabloları b,c,d gibi tablo_a nın yanına ekliyoruz. Sonuç her zaman "istediğimiz" gibi... İyi ÇalışmalarAZIZ
|
|
|
|
|
Logged
|
|
|
|
|
 |