Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL compte les résultats de requêtes complexes ?

Votre problème est que votre requête ne renvoie pas ce que vous pensez qu'elle renvoie (il est toujours utile d'exécuter votre requête de manière autonome, pour voir si le jeu de résultats correspond à ce que vous attendez).

Bon, décomposons ça.

Vous essayez de compter tous les messages qui ne le font pas avoir un enregistrement correspondant dans la table des taxis, pour cet ID utilisateur. Ce que vous voulez ici, c'est JOIN les tables et obtenir ces lignes dans post qui seraient normalement exclus par la jointure. Ceci est réalisé par une jointure externe gauche

(édité )

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

Ce HAVING clause dit :uniquement les lignes du jeu de résultats qui n'avaient pas de t.taxiID correspondant.

Si vous exécutez cette requête et obtenez l'ensemble de lignes attendu (messages qui n'ont pas été appréciés ou détestés par cet utilisateur), ALORS vous pouvez ajouter une requête externe pour compter le nombre de lignes renvoyées :

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

Cela devrait retourner un seul scalaire nommé count. Dans ce cas, vous pourrez dire :

if ($count[0]->count > 10) { blah blah blah }

(2e édition ) Cette requête interne vous permettra d'obtenir les messages qui ont soit la valeur = 1 dans la table des taxis, soit aucune valeur du tout, ce qui entraîne le renvoi de 4 pour votre exemple :

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