Su problema es que su consulta no devuelve lo que cree que devuelve (siempre ayuda ejecutar su consulta de forma independiente, para ver si el conjunto de resultados es lo que espera).
Bien, analicemos esto.
Estás intentando contar todas las publicaciones que no tener un registro coincidente en la tabla de taxis, para ese ID de usuario. Lo que quieres aquí es JOIN
las tablas y obtenga esas filas en post
que normalmente sería excluido por la unión. Esto se logra mediante una combinación externa izquierda
(editado )
SELECT p.ID, t.taxiID
FROM post p LEFT OUTER JOIN taxi t ON p.ID = t.taxiID AND t.userID = '.$user.'
HAVING t.taxiID IS NULL
Que HAVING
cláusula dice:solo aquellas filas en el conjunto de resultados que no tenían un t.taxiID correspondiente.
Si ejecuta esta consulta y obtiene el conjunto esperado de filas (publicaciones que no tienen gustos o disgustos por parte de ese usuario), ENTONCES puede agregar una consulta externa para contar el número de filas devueltas:
SELECT COUNT(*) as count FROM (
SELECT p.ID, t.taxiID
FROM post p LEFT OUTER JOIN taxi t ON p.ID = t.taxiID AND t.userID = '.$user.'
HAVING t.taxiID IS NULL
) a
Esto debería devolver un único conteo escalar con nombre. En este caso podrás decir:
if ($count[0]->count > 10) { blah blah blah }
(Segunda edición ) Esta consulta interna le dará aquellas publicaciones que tienen valor =1 en la tabla de taxis, o ningún valor en absoluto, lo que da como resultado que se devuelvan 4 para su ejemplo:
SELECT p.ID, t.taxiID, t.value
FROM post p LEFT OUTER JOIN taxi t ON p.ID = t.taxiID AND t.userID = '.$user.'
HAVING t.taxiID IS NULL OR t.value = 1