İyinet'e Hoşgeldiniz!

Türkiye'nin En Eski Webmaster Forum'una Hemen Kayıt Olun!

Kayıt Ol!

iki tablodan tek sorguyla bilgi almak

hakimi

0
İyinet Üyesi
Katılım
1 Temmuz 2006
Mesajlar
1,356
Reaction score
0
şimdi diyelim a tablosundan ve b tablosundan bilgiler alınacak ve kullanılacak bunları left join le tek sorguda alabilirmiz?
Şayet alırsak bu mysql için iyi bir şeymidir? daha az mı yorar yoksa tersimidir?

mesela iki tablodan bilgileri aldık left join (daha hiç kullanmadım) v.b. uygun bir sorguyla bunları ekrana basabilirmiyz?

meseal hem makale tablosundaki bir id ye ait bilgilerin hepsini alacaz hem de kategori tablosundan (makale toblasundaki id ye ait olan kategorinin) kategori id si ve kategori adını alacaz. konu hakkında yardımcı olursanız sevinirim.
ek yapayım bunu yaptık diyelim iki tabloda da aynı field isimleri varsa ne yaparız? nasıl sonuçları ayırırız?

şöyle bir sorgu oluşturdum ancak bir yerde hata var.

PHP:
$q=mysql_query("select ha.*, hkategori.* from ha JOIN hkategori 
ON (hkategori.id = ha.haber_kategori1) where (ha.haber_id='$id')");
where ve sonrasını kaldırırsam sonuç dönüyor ama where i koyduğumda sonuç vermiyor lisanssız dönüyor.
 

zahmaci

0
İyinet Üyesi
Katılım
19 Ekim 2003
Mesajlar
549
Reaction score
0
Konum
Antalya
Şöyle yapsan aynı şey değil mi ?
Kod:
SELECT ha.*, hkategori.* FROM ha, hkategori WHERE hkategori.id = ha.haber_kategori1 AND ha.haber_id='$id'
Bunun çalışması lazım
 

Angelo

0
İyinet Üyesi
Katılım
13 Aralık 2004
Mesajlar
9,603
Reaction score
111
Konum
AZ
Elbette ki coklu tablolu sorgular yapilabilir ve buyuk cogunlukta uygun indeks kullanimlariyla verimli islemlerdir bunlar. Orneginizde lisanssız dondurmesinin nedeni haber tablosundaki kategori id elemaninin kategori tablosunda olmamasi olabilir. Left veya Right join kullanimi bu tip durumlarda hatayi teshis edebilir.

Ornek
========
Tablo (yazilar)
yazi_id
yazi_baslik
yazi_icerik
kat_id

olsun

Tablo (kategoriler)
kat_id
kat_name

olsun

Kayitlar

yazilar icin
1 - ikinci el arac fiyatlari - bilgiler vs vs.... - kat id=2
2 - ekonomik gelismeler - bilgiler vs vs.... - kat_id=3
olsun

kategoriler icin
1 - yemek
2 - araba olsun

Kod:
SELECT y.yazi_baslik, k.kat_name
FROM yazilar y
INNER JOIN kategoriler k ON y.kat_id=k.kat_id
WHERE y.yazi_id='1'

Burda cikti olarak
ikinci el arac fiyatlari ve arabayi verir.

Kod:
SELECT y.yazi_baslik, k.kat_name
FROM yazilar y
INNER JOIN kategoriler k ON y.kat_id=k.kat_id
WHERE y.yazi_id='2'

Herhangi bir row dondurmez, cunku 2 numarali yazinin kat_id'si olan 3'u join edemiyor kategorilerde boyle bir kayit yok. (INNER JOIN)

Kod:
SELECT y.yazi_baslik, k.kat_name
FROM yazilar y
LEFT OUTER JOIN kategoriler k ON y.kat_id=k.kat_id
WHERE y.yazi_id='2'

ekonomik gelismeler - lisanssız
dondurur. Yazi basligini cekebildi ancak kategorilerde kayit olmadigi icin lisanssız olarak dondurdu bu bolgeyi. INNER degil LEFT yaptigimiz icin de filtrelemedi, LEFT-SOL tarafi baz alarak (bu ornekte yazilar tablosu) sonuclari yazdi ve basarisiz joinlere lisanssız basti.

RIGHT join yapildiginda da birlestirilen tablolarin sag tarafi baz alinarak filtreleme yapilir. Bu ornekte kategoriler tablosu olurdu mesela. Ornekler cogaltilabilir.
 

hakimi

0
İyinet Üyesi
Katılım
1 Temmuz 2006
Mesajlar
1,356
Reaction score
0
teşekkürler Angelo çok faydalı bir döküman olmuş. benim asıl sorunum iki tabloda da aynı isimde field ların olması. üzerinde biraz daha çalışsam bayağı faydalı olacak sanırım bu join meselesi.
 

Angelo

0
İyinet Üyesi
Katılım
13 Aralık 2004
Mesajlar
9,603
Reaction score
111
Konum
AZ
Ayni isimde olmasi zaten genelde normal/gerekli olan birseydir ve programcilar tarafindan rahat kod yazmak amaciyla tercih edilir. Yani bir shopping cart uygulaman var diyelim, urun_id en az 10 tabloda yer alan elzem bir elemandir. Bir sorguda 15 join yaptigimiz olabiliyor urun_id yi bagliyorsun, kategori, resim, bilgiler, urller tablosu vb.

tabloa.urun_id, tablob.urun_id gibi kullandigin icin zaten filtrelemelerde ilgili tabloyu kullanir. Tablo referansini vermezsen ambigious / muallakta kaldim der zaten.
 

hakimi

0
İyinet Üyesi
Katılım
1 Temmuz 2006
Mesajlar
1,356
Reaction score
0
sanırım tüm problemleri özdüm ve 3 tablodan bilgi aldım kod şölye:
PHP:
$q=mysql_query("SELECT video.*, kategori.*, vote.* from video
INNER JOIN kategori ON video.kat=kategori.katid 
INNER JOIN vote ON video.id = vote.vid 
order by video.id DESC limit 0,11");
teşekkürler
 

Türkiye’nin ilk webmaster forum sitesi iyinet.com'da forum üyeleri tarafından yapılan tüm paylaşımlardan; Türk Ceza Kanunu’nun 20. Maddesinin, 5651 Sayılı Kanununun 4. maddesinin 2. fıkrasına göre, paylaşım yapan üyeler sorumludur.

Backlink ve Tanıtım Yazısı için iletişime geçmek için Skype Adresimiz: .cid.1580508955483fe5

Üst