Şöyle bir fonksiyon işini görecektir.

Değiştirmen Gereken Yerler : pid yerine üstkategoriID(tablonda yazan)
id yerine de kategoriID.

Fakat burada senin hatan normalde benzersiz ID üzerinden gitmen işini dahada rahatlatır. id anahatarından yola çıkarak kategorileri birbirine bağlayabilirsin.

function kategoriListe($id)
{
global $con;

echo "
    ";

    $kod="SELECT
    K.id, K.kategoriAdi,
    (SELECT COUNT(A.id) FROM kategoriler AS A WHERE A.pid=K.id ) as altKategoriSayisi
    FROM kategoriler AS K
    WHERE K.pid={$id}";
    $sql=mysqli_query($con,$kod);
    while($veri=mysqli_fetch_assoc($sql))
    {
    echo "
  • ".$veri["kategoriAdi"];

    if($veri["altKategoriSayisi"]>0)
    kategoriListe($veri["id"]);

    echo "
  • ";

    }

    echo "
";
}

Google'de https://www.google.com/search?q=s%C4%B1n%C4%B1rs%C4%B1z+kategori+listeleme&oq=s%C4%B1n%C4%B1rs%C4%B1z+kategori+listeleme&aqs=chrome..69i57.3495j0j1&sourceid=chrome&ie=UTF-8 bu şekilde bir arama yaparsan bir çok videolu sonuç mevcut. Takıldığın yerde sorabilirsin kolay gelsin.