Opiszę Ci jak ja to robię. Będę bazował na Twoim przykładzie i danych.
1. Wykonujesz zapytanie:
SELECT * FROM categories ORDER BY name ASC;
Dzięki temu będziesz miał dane odpowiednio posortowane (jako kolumna sortująca możesz wybrać cokolwiek).
2. Pobierasz dane, przelatujesz po nich pętlą - nie podam Ci dokładnego kodu, ale napiszę jaką tablicę powinieneś dostać na wyjściu:
array('id' => 2, 'parent_id' => 0, 'name' => 'audi'), array('id' => 1, 'parent_id' => 0, 'name' => 'vw') ),
array('id' => 3, 'parent_id' => 2, 'name' => 'a3') ),
array('id' => 4, 'parent_id' => 1, 'name' => 'passat') )
);
Struktura jest taka: klucz tablicy to po prostu parent_id, a wartości to tablica elementów przyporządkowanych do danego rodzica. Kolejność kluczy nie ma większego znaczenia, ważne, że dzieciaki są uporządkowane

według porządku, który podałeś w ORDER BY.
3. Wyświetlenie drzewa to prosta funkcja rekurencyjna, do której podajesz jako parametr całą tablicę danych oraz id aktualnie generowanego poziomu, np.
$tree = tree($data, 0);
Ten kod powinien wyświetlić tylko elementy dla parent_id = 0 czyli
audi i
vw.
4. Wewnątrz tej funkcji iterujesz po każdych elementach danego poziomu (dla 0 wspomniane
audi i
vw). Po wyświetleniu danego elementu wykonujesz rekurencyjnie:
$return .= tree($data, $item['parent_id']);
dzięki czemu będziesz miał również wyświetlanie kolejnych potomków.
Całość najlepiej wyświetlić w postaci listy <ul> - będziesz wówczas widział wszelkie zagnieżdżenia.
Jeśli będziesz miał problemy to śmiało pisz.