Kiedy robisz select distinct count(id) wtedy w zasadzie robisz:
select distinct cnt
from (select count(id) as cnt from t) t;
Ponieważ zapytanie wewnętrzne zwraca tylko jeden wiersz, distinct nic nie robi. Zapytanie zlicza liczbę wierszy w tabeli (a dokładniej, liczba wierszy, w których id nie jest null ).
Z drugiej strony, kiedy to zrobisz:
select count(distinct id)
from t;
Następnie zapytanie zlicza liczbę różnych wartości, które id zajmuje w tabeli. Wygląda na to, że tego chcesz.