Öncelikle benim önerim tablo yapısını değiştirmen olacaktır.

Firmalar
id
firma_adi

Markalar
id
marka_adi

Ürünler
id
f_id
m_id
stok_kodu
urun_adi
fiyat
stok_durumu

Listeletmek istediğin asıl tablo ürünler tablosu olduğu için diğerleri sadece köprü görevi üstlenecek. Bu köprülerle bağlantıyı sağlamak için de ürünler tablonu diğer 2 tabloyla eşitlemen yeterli olacaktır.

Listeletmek için örnek sorgular;

Markalarına göre ürünleri listeletmek istiyorsan eğer;
SELECT * FROM urunler, markalar WHERE markalar.id=urunler.m_id GROUP BY urunler.m_id ORDER BY markalar.marka_adi ASC
group by ile array olarak çektiğimiz verilerin tek bir gruba ait olduğunu belirliyoruz. order by ile de marka adına göre listeletiyoruz. bu sorgudan alacağın değeri bir değişkene atayarak o markanın hangi firmaya ait olduğunu listelebilirsin.

mesela biz yukarıda bulunan sorgudan döndüreceğimiz değeri $markai değişkenine atayalım.

SELECT * FROM urunler, firmalar WHERE urunler.m_id=".$markai['id']." AND urunler.f_id=firmalar.id GROUP BY f_id
Yine group by ile firmaları tekrarlamaması için bir grup içerisine alıyoruz. Bu şekilde eklediğimiz ürün hangi marka yada firmada ise ona göre listeletiyoruz.

başlıkları bu şekilde listeletebilirsin. başlık listeletme işleminde kullanmayacağın tabloları çıkartmak için join işlemi işine yarayabilir.

içeriği listeletirken de yine tablolar arasındaki eşitlemeyi sağlamak yeterli olacaktır.