【问题标题】:INNER JOIN always returns 1 row (even if its empty)?INNER JOIN 总是返回 1 行(即使它是空的)?
【发布时间】:2012-07-17 01:44:42
【问题描述】:

我有一个方法可以从我正在创建的锦标赛系统中返回数据。我有一个问题,即 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;
            }

        }
    }

【问题讨论】:

  • 另外请不要提及我不应该使用mysql_*函数,我还没有更改为使用准备好的语句的对象。
  • 你能在某处添加“HAVING COUNT(P.id) > 0”吗?
  • 谢谢你的工作,我意识到我还有另一个问题 - COUNT(P.id) 总是返回完整的表,而不仅仅是我使用 INNER JOIN 设置的表。想法?
  • 这就是您使用“GROUP BY T.id, T.name, T.description, T.checkin, T.date”的地方这样您就可以将聚合函数(计数)应用于分组创建。如果您不指定分组,您将获得整个表格。 (在某些 SQL 风格中,没有显式分组会导致您的情况出错。)
  • 问题出在SQL查询,而不是PHP代码。您能否编辑您的问题以提供CREATE TABLEINSERT ... VALUES 语句形式的示例架构和数据?否则,我会在通过定义我自己的数据来回答您的问题时做出假设。

标签: php mysql inner-join


【解决方案1】:

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

【讨论】:

  • 查询更多的是一个起点 - 您可能需要列出 GROUP BY 行中的所有列,因为我已经编辑了我的答案以显示。
  • 是的,多亏了 Pilotcam,我才意识到这一点,因此我删除了评论 LOL - 顺便谢谢
  • 哈哈,现在我看起来像是在自言自语。祝你好运!
猜你喜欢
  • 2023-03-16
  • 1970-01-01
  • 2021-09-12
  • 1970-01-01
  • 1970-01-01
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多