Seu problema é que sua consulta não está retornando o que você acha que ela retorna (sempre ajuda a executar sua consulta de forma independente, para ver se o conjunto de resultados é o que você espera).
Certo, vamos quebrar isso.
Você está tentando contar todas as postagens que não tem um registro correspondente na tabela de táxis, para esse userID. O que você quer aqui é
JOIN
as tabelas e obter essas linhas em post
que normalmente seriam excluídos pela junção. Isto é conseguido por uma junção externa esquerda (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 está dizendo:apenas as linhas no conjunto de resultados que não têm um t.taxiID correspondente. Se você executar esta consulta e obter o conjunto esperado de linhas (postagens que não têm gostos ou não gostos por esse usuário), ENTÃO você pode adicionar uma consulta externa para contar o número de linhas retornadas:
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
Isso deve retornar uma única contagem escalar nomeada. Neste caso, você poderá dizer:
if ($count[0]->count > 10) { blah blah blah }
(2ª edição ) Essa consulta interna fornecerá as postagens que têm valor =1 na tabela de táxis ou nenhum valor, o que resulta no retorno de 4 para o seu exemplo:
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