PHP Kategori Listeleme İlginç Sorun

Merhaba arkadaşlar.
Sistemde varolan kategorileri listelemek istiyorum. Inner join kullanmadan listeleme yaptığımda aşağıdaki gibi düzgün bir şekilde listeleniyor. Benim istediğim sonuç da bu.


Ama ben inner join kullanmak istiyorum çünkü kategori ismi yanına o kategoriye ait kaç tane makale var yazdırmak istiyorum . Ancak şöyle bir durum var. Sonuç yukarıdaki resim gibi olmuyor var olan makale sayısı kadar (2 tane Genel kategorisinde, 2 tane PHP kategorisinde makale var) listeleme yapıyor aşağıdaki resimde olduğu gibi. Bu sorunu nasıl çözebilirim?

<?php
	//$kategoriBul = mysql_query("SELECT * FROM kategoriler WHERE kategori_durum=1 ORDER BY kategori_id ASC");
	$kategoriBul = mysql_query("SELECT * FROM makaleler INNER JOIN kategoriler ON kategoriler.kategori_id=makaleler.makale_kategori_id WHERE kategori_durum=1 ORDER BY kategori_id ASC");
	$kategoriSay = mysql_num_rows($kategoriBul);
?>

<!--- Kategoriler Panel --->
<div class="Kategoriler-Panel">
<div class="Panel-Baslik">KATEGORİLER</div>
<div class="Kategoriler-Icerik">
	<ul>
		<?php
		
		if( $kategoriSay > 0 ){
			
			while($kategori = mysql_fetch_array($kategoriBul)){ ?>
				<li><a href="index.php?git=kategori&id=<?php echo $kategori["kategori_id"]; ?>"><i class="fa fa-folder"></i><?php echo $kategori["kategori_adi"]; ?></a></li>
			<?php } ?>
				
		<?php }else{
			echo "<div class='Panel-Bilgi'>Henüz bir kategori eklenmemiş!</div>";
		}
		
		?>
	</ul>
</div>
</div>
<!--# Kategoriler Panel #-->

 

Selamlar,

Php bilmiyorum ancak sql sorgusu olarak yardımcı olabilirim.

Şimdi bu kısımda inner join kullanmana gerek yok iç içe select i kullanarak rahatça bu durumu çözebilirsin.

Örnek;

Select kategori_Adi as Kategori, 

(Select Count(*) From Makaleler where Makale_Kategori_id = kategori_id)  as Adet

-- Makaleler tablosunda kategori adını tutuyorsan
--(Select Count(*) From Makaleler where Makale_Kategori_Adi = kategori_Adi)  as Adet

from Kategoriler 

 WHERE kategori_durum=1 ORDER BY kategori_id ASC

Bu sorgu ile istediğini rahatça yapabilirsin.

 

Yaşadığın sorunun sebebi 2 adet  GENEL kategorisine 2 adet de PHP kategorisine makale eklemişsindir. Ondan dolayı ikişer adet çıkıyor. Eklediğin makale kadar orada kategori adı yazacaktır.

İlla inner join ile yapacaksan da ana tabloyu Kategoriler tablosu yapman lazım, Çünkü asıl amacın ketagori listesini almak. Mantık ise neyin listesini almak istiyorsan ana tablo o olmalıdır.

Ana tablo deken. İnner Join sorgumu bu şekilde de yaptım ama sonuç aynı.
 

$kategoriBul = mysql_query("SELECT * FROM kategoriler INNER JOIN makaleler ON makaleler.makale_kategori_id=kategoriler.kategori_id WHERE kategori_durum=1 ORDER BY kategori_id ASC");

 

Kendi tablolarımda denedim ve inner join kullanarak bu şekilde sorunsuz çalıştı.

SELECT TOP 100 PERCENT
	Kat_Adi as kategori_Adi,
	COUNT(Haberler.Hbr_Kategori) adet
FROM Kategoriler
INNER JOIN Haberler
	ON Haberler.Hbr_Kategori = Kategoriler.Kat_Adi
WHERE Kategoriler.Aktif = 1
GROUP by Haberler.Hbr_Kategori,Kategoriler.Kat_Adi
ORDER BY Kategoriler.Kat_Adi ASC

Her kategori adından bir tane görünmesi için 

GROUP by Haberler.Hbr_Kategori,Kategoriler.Kat_Adi

şeklinde gruplaman ve 

COUNT(Haberler.Hbr_Kategori) adet

ile makaleler tablondaki ilgili kategoriye ait makaleleri saydırman lazım. 

Group by kullanmadan bu işi istediğin örnekteki gibi yapamazsın.Çünkü aynı kategoriden iki tane olmak isteyecek ancak count ile saydırdığında bir kayıt dönecek. Bu şekilde bir liste hazırlayamayacağı için senden kategori adını gruplamanı isteyecek.

Ekran görüntüsü:

Ama burada inner join kullanama bile gerek yok. Yukarıdaki verdiğim şekilde bunu rahat rahat yapabilirsin.

ilk verdiğim örnekteki gibi yaparsan da sonuç aşağıdaki gibi olur.

Teşekkür ederim.

Yardımcı olabildiğime sevindim. 

Bol kodlu günler. :) 

Bir şey sormak istiyorum. AS kodunu kullanmadan yapma şansımız yok mu yoksa AS kodunu kullanmamız şart mı?

Cevap Yaz

Cevap yazabilmek için üye girişi yapmanız gerekiyor!

Yukarı Git