2012-07-17 4 views
0

J'ai une méthode qui retourne des données d'un système de tournoi que je crée. J'ai un problème où la requête INNER JOIN renvoie toujours une ligne, peu importe si la clause WHERE est vraie ou non.INNER JOIN renvoie toujours 1 ligne (même si elle est vide)?

Dans la base de données il y a deux tournois, tous les deux avec un T.game = '1' - mais si je vérifie la requête de T.game = '2', il retourne toujours une ligne selon mysql_num_rows(), et quand je print_r() le tableau résultant, il est vide à l'exception de la ligne COUNT(), mais la clause WHERE ne devrait-elle pas trouver de lignes et le représenter en conséquence au mysql_num_rows()?

Je pense que ma principale question est de savoir comment puis-je arrêter le compte (P.id) d'afficher toujours, même quand il n'y a aucune ligne ne correspond dans les tournois tableau

public function fetchTournaments($gameID){ 
     if($gameID == "" || $this->hasChar($gameID) || $this->hasSymb($gameID)){ 
      $this->_errorMsg = "Invalid Game ID."; 
      return false; 
     }else{ 
      $query = mysql_query("SELECT 
            T.id, 
            T.name, 
            T.description, 
            T.checkin, 
            DATE_FORMAT(T.date,'%b %d, %Y @ %h:%i %p') AS date, 
            COUNT(P.id) AS playernum 
            FROM tournaments T 
            INNER JOIN players P 
            ON T.id = P.tourney_id 
            WHERE T.game='{$gameID}'") or die(mysql_error()); 
      $result = mysql_num_rows($query); 
      if($result > 0){ 
       echo $result; 
       $output = mysql_fetch_array($query); 
       return $output; 
      }else{ 
       $this->_errorMsg = "There are no tournaments for this game."; 
       return false; 
      } 

     } 
    } 
+0

Aussi s'il vous plaît ne mentionnez pas que je ne devrais pas utiliser les fonctions mysql_ *, je dois encore changer d'objets à utiliser déclarations préparées. – TurdPile

+0

Pouvez-vous ajouter "HAVING COUNT (P.id)> 0" là quelque part? – pilotcam

+0

Merci qui fonctionne, j'ai réalisé que j'avais un autre problème cependant - le COUNT (P.id) est toujours retourner la table complète au lieu de seulement ceux où je définis en utilisant le INNER JOIN .. pensées? – TurdPile

Répondre

2

MySQL, COUNT (comme les autres agrégats fonctions) retournera toujours un résultat. Vous pourrez peut-être contourner ce problème en utilisant GROUP BY, qui renverra les résultats de l'agrégat pour chaque ligne. Vous pouvez jouer avec les colonnes que vous énumérez dans le GROUP BY, mais peut-être quelque chose comme:

$query = mysql_query("SELECT 
        T.id, 
        T.name, 
        T.description, 
        T.checkin, 
        DATE_FORMAT(T.date,'%b %d, %Y @ %h:%i %p') AS date, 
        COUNT(P.id) AS playernum 
        FROM tournaments T 
        INNER JOIN players P 
        ON T.id = P.tourney_id 
        WHERE T.game='{$gameID}' 
        GROUP BY T.id,T.name,T.description,T.checkin,date") or die(mysql_error()); 
+0

La requête était plus d'un point de départ - vous auriez probablement besoin de lister toutes les colonnes dans la ligne 'GROUP BY' comme J'ai édité ma réponse pour montrer. –

+0

oui je l'ai réalisé grâce à pilotcam, d'où mon commentaire supprimé LOL - merci d'ailleurs – TurdPile

+0

haha, maintenant j'ai l'air de me parler. Bonne chance! –

Questions connexes