Merhaba, Ziyaretçi. Lütfen giriş yapın veya üye olun.
Aktivasyon mailiniz gelmediyse buraya tıklayın.
06, 2008, 06:18:56 pm
42719 Mesaj 8080 Konu Gönderen: 17917 Üye
Son üye: halukakin
Turk-Php.Com Forum  |  Yardım Forumları  |  Veritabanı Yardım Forumu  |  4 Tablo birleştirme (Bağımsız olarak) « önceki sonraki »
Sayfa: [1] Yazdır
Yazan Konu: 4 Tablo birleştirme (Bağımsız olarak)  (Okunma Sayısı 488 defa)
tiamat
PHP Stajyeri
**
Offline Offline

Mesaj Sayısı: 404



Üyelik Bilgileri WWW
4 Tablo birleştirme (Bağımsız olarak)
« : 16, 2006, 03:54:55 am »

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
PHP Programcısı
****
Online Online

Mesaj Sayısı: 940



Üyelik Bilgileri
Ynt: 4 Tablo birleştirme (Bağımsız olarak)
« Yanıtla #1 : 16, 2006, 07:48:26 am »

Kod:
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ı?

Kod:
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

Jabber:
xmpp:aziz@member.turk-php.com
Alihan ÇETİN
www.azizce.com
engin
Admin
*
Offline Offline

Mesaj Sayısı: 496



Üyelik Bilgileri
Ynt: 4 Tablo birleştirme (Bağımsız olarak)
« Yanıtla #2 : 16, 2006, 08:27:49 am »

Kod:
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ı?

Kod:
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ı? Smiley

Ş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
PHP Stajyeri
**
Offline Offline

Mesaj Sayısı: 404



Üyelik Bilgileri WWW
Ynt: 4 Tablo birleştirme (Bağımsız olarak)
« Yanıtla #3 : 16, 2006, 08:52:06 am »

Yani join mi kullanmam gerek sonuc olabilmesi için.
Logged

Tuvalete oturmadan önce,
Musluğunu kontrol et bence
engin
Admin
*
Offline Offline

Mesaj Sayısı: 496



Üyelik Bilgileri
Ynt: 4 Tablo birleştirme (Bağımsız olarak)
« Yanıtla #4 : 16, 2006, 08:54:26 am »

deneyip görmek lazım Smiley
Logged

Engin Dumlu
engin ~ turk-php.com
achilles ~ member.turk-php.com
aziz
PHP Programcısı
****
Online Online

Mesaj Sayısı: 940



Üyelik Bilgileri
Ynt: 4 Tablo birleştirme (Bağımsız olarak)
« Yanıtla #5 : 16, 2006, 05:59:26 pm »

Ok...
Açıklayıcı bir kod koymayı uygun gördüm. İnceleyip neler olduğunu anlamaya çalışabilirsiniz...

Tablolar :

Kod:
# 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... Wink

Şimdi PHP koduna bakalım...

Kod:
<?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 ."&nbsp;&nbsp;|&nbsp;&nbsp;";
}

echo 
"<br>\n";

$row $result->fetch_array(MYSQLI_NUM);
printf ("%s &nbsp;&nbsp;|&nbsp;&nbsp; (%s) &nbsp;&nbsp;|&nbsp;&nbsp; %s &nbsp;&nbsp;|&nbsp;&nbsp; (%s) &nbsp;&nbsp;|&nbsp;&nbsp; %s &nbsp;&nbsp;|&nbsp;&nbsp; (%s) &nbsp;&nbsp;|&nbsp;&nbsp; %s &nbsp;&nbsp;|&nbsp;&nbsp; (%s) &nbsp;&nbsp;|&nbsp;&nbsp; %s &nbsp;&nbsp;|&nbsp;&nbsp; (%s) &nbsp;&nbsp;|&nbsp;&nbsp; %s &nbsp;&nbsp;|&nbsp;&nbsp; (%s) &nbsp;&nbsp;|&nbsp;&nbsp; %s &nbsp;&nbsp;|&nbsp;&nbsp; <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 => )
Kod:
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ışmalar


AZIZ
Logged

Jabber:
xmpp:aziz@member.turk-php.com
Alihan ÇETİN
www.azizce.com
Sayfa: [1] Yazdır 
« önceki sonraki »
Gitmek istediğiniz yer:  


Turk-Php.Com Forum | SMF Forum Software © 2005, Simple Machines LLC. All Rights Reserved.