PHP inner join hakkında
Merhaba 3 adet tablom var hesaplar, gelir ve gider. Örnek olarak kullanıcı id'si 1 olanların hangi hesaplarının olduğunu ve o hesaplara ait gelir ve gider tablosundaki verilerini göstermek istiyorum. Hesaplar tablosunda o kullanıcıya ait hesaplar var yani toplam_para=sum(gelir)-sum(gider) yapmak istiyorum.
<?php
<?php
$gelir=$db->prepare("select hesap_id, hesap_adi, toplam_para, gelir_tutari, gider_tutari from hesaplar inner join gelir on hesaplar.kullanici_id=gelir.kullanici_id
inner join gider on hesaplar.kullanici_id=gider.kullanici_id where hesaplar.kullanici_id=$id GROUP BY hesaplar.hesap_adi
");
$gelir->execute();
$gelecek=$gelir->fetchAll();
print_r($gelecek);
foreach($gelecek as $hesaps){ ?>
<li class="hesap_listesi_hesaplar_hesap">
<a href="gecmis.php">
<span class="hesap_title"><?php echo ucfirst_tr($hesaps['hesap_adi']); ?></span>
<span class="hesap_bakiye"><?php echo number_format($hesaps['toplam_para'], 0, ",",".")." ₺";?></span>
</a>
</li>
<?php } ?>
?>
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (8)
Bu faso fiso çıktı herhalde
"Bildiğim kadarıyla birleştirdiğin anahtarı sorgularında kullanamıyorsun." :)
$sql = "SELECT
a.adi as AAdi,
a.id as AID,
a.istediğin veriler,
b.istediğin veriler,
c.istediğin veriler
FROM
a
INNER JOIN b ON a.id = b.id
INNER JOIN c ON a.id = c.id
WHERE a.id =?";
$sql->execute([$gelenAIDDEĞERİ]);
$row = $sql->fetch(2); // 2 PDO::FETCH_ASSOC demek oluyor
// a.id değeri ile eşleşen b.id ve c.id tablolarından SELECT den sonra yazdığın her veriyi çekebilirsin
söyle bakalım senin siparisler tablon var orda userID urunID tutuyorsun
siparislere gelen userID ve urunlere giden urunID sütünlarını users tablon var diyelim
users.id = siparisler.userID
urun.id = siparisler.urunID
şeklinde karşılaştırıp oan denk gelen bütün ve tek olarak siparişi çekebilirsin
SQL
Attığım sql'i indir,
Yeni bir veritabanı oluşutur,
Oluşan veritabanına tıkla,
İçeri aktar'a tıkla,
Dosya seç'e tıkla,
Aşağıdaki git'e tıkla
Aşağıdaki sorguyu çalıştırırsan
SELECT u.u_id, u.ad 'Müşteri Adı', ie.miktar 'İşlem Tutarı', ie.tarih 'İşlem Tarihi', a.ad 'Banka Adı' FROM `users` u JOIN income_expense ie ON u.u_id = ie.u_id JOIN accounts a ON a.a_id = ie.a_id WHERE u.u_id = 1
Çıktısı:
Sorgusuz çalışan hali:
Biraz kayıt eklersen üzerinde her türlü işlemi yapabilirsin, umarım doğru anlamışımdır.
hesaplar tablom : https://prnt.sc/yqeq8p
gelir tablom : https://prnt.sc/yqet6h
gider tablom : https://prnt.sc/yqeud4
Yani kullanıcı_id=$id olanların hesaplarını listeleticem fakat listelerken şu işlemleri de yapmak istiyorum,
gelir tablosundaki o kullanıcıya ait her hesabın gelirini hesaplardaki toplama ekleyeceğim aynı şekilde giderde öyle.
Umarım yapmak istediğimi anlatabilmişimdir çünkü çok bilgili değilim.
Evet birleştirmemelisiniz, birleştiriyorsanız dahi onlarla ilgili sorgu yazamazsınız. Tablo yapını gösterebilirsen daha çok yardımcı olabilirim.
Selamlar Hocam,
Bildiğim kadarıyla birleştirdiğin anahtarı sorgularında kullanamıyorsun.
Senin sorgundaki kullanici_id gibi örnek olarak
SELECT * FROM
gelir gl JOIN gider gd
ON gl.kullanici_id = gd.kullanici_id // Birleştirilen anahtarlar
WHERE gl.kullanici_id = 3 veya gd.kullanici_id = 3 veya kullanici_id = 3
bu şekilde dahi kullanımı mevcut değil. Demem o ki veritabanını yeniden düzenlemen gerekicek.
Dediklerime ek olarak, uzun olan tablo isimlerini
SELECT * FROM tablo_adi AS ta WHERE ta.sutun_adi = 'deger';
/*--------- veya ------*/
SELECT * FROM tablo_adi ta WHERE ta.sutun_adi = 'deger';
şeklinde kısaltıpta kullanabilirsin.