INNER JOIN总是返回1行(即使它是空的)?

时间:2012-07-17 01:44:42

标签: php mysql inner-join

我有一个从我正在创建的锦标赛系统返回数据的方法。我有一个问题,INNER JOIN查询总是返回一行,无论WHERE子句是否为真。

在数据库中有两个锦标赛,两个都有一个T.game ='1' - 但如果我检查T.game ='2'的查询,它仍会根据mysql_num_rows()返回一行,当我print_r()结果数组时,除了COUNT()行之外它是空的,但是WHERE子句不应该找不到任何行并将其相应地描述为mysql_num_rows()

我想我的主要问题是,即使比赛表中没有匹配的行,我如何停止COUNT(P.id)始终显示

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;
            }

        }
    }

1 个答案:

答案 0 :(得分:2)

在MySQL中,COUNT(与其他聚合函数一样)将始终返回结果。您可以使用GROUP BY来解决这个问题,它将返回每行聚合的结果。您可能希望使用GROUP BY中列出的列,但可能会这样:

$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());