0

作成しているトーナメントシステムからデータを返すメソッドがあります。WHERE句がtrueであるかどうかに関係なく、INNERJOINクエリが常に1行を返すという問題があります。

データベースには2つのトーナメントがあり、どちらも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;
            }

        }
    }
4

1 に答える 1

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());
于 2012-07-17T02:06:17.760 に答える