Arkadaşım bu şekilde bir yapı kurup find_in_set ve having=1 kullanman yanlış, sağ kulağını sol elinle göstermek gibi olur. Yani tablo yapın

id | ustkat_id | kategori_adi
3 1 Falanca kategori

gibi ise. Çünkü zaten direk
select * from kategoriler where ustkat_id=1
diye alabilirsin. Yok eğer ustkat_id de bağlantılı kategorileri 5,2,1,-1 gibi tutuyorsan having=1 kullanman yanlış.

Bu durumda ilk söylediğim şekilde tutuyorsan ya urunler için kategori ve ana kategori şeklinde iki alan tutup bu alanlara göre çekeceksin

select * from urunler where kat_id=1 or ustkat_id=1
şeklinde. Ya da sınırsız kategori ve virgül ile ayırıp having kullanıyorsan örneğin şu şekilde:


id | ustkat_id | kategori_adi
---------------------------
1 | 1,-1 | Okul ürünleri
2 | 2,1,-1 | Kalemler
3 | 3,1,-1 | Silgiler
4 | 4,-1 | Toner
5 | 5,4,-1 | Hp
6 | 6,4,-1 | Xerox

'select *, find_in_set('.$kategori_id.',ustkat_id) as seviye from kategoriler having seviye = 2';
şeklinde kategoriler tablosundan o kategorinin alt kategorilerini bulup, gelen kat. idlerine göre ürünler tablosundan ürünleri çekeceksin.