什么';我的加入声明有什么问题吗?它在PHP中返回布尔值

什么';我的加入声明有什么问题吗?它在PHP中返回布尔值,php,mysql,sql,Php,Mysql,Sql,为了让我的问题尽可能清楚(之前我一直抱怨太模糊),下面是我在项目中处理的两个表的结构和数据。 表1包含足球比赛列表,表2包含将记录在表1中的英国足球队 我只是从图书馆里拿的一本书中学习SQL。我已经按照有关联接表数据的说明进行了操作。在这里,我只是尝试将数据回显到页面上,以确保在围绕此数据设置页面样式之前,我的查询是正确的 <?php //Set DB Variables $dbc = mysql_connect(host, username, pa

为了让我的问题尽可能清楚(之前我一直抱怨太模糊),下面是我在项目中处理的两个表的结构和数据。 表1包含足球比赛列表,表2包含将记录在表1中的英国足球队

我只是从图书馆里拿的一本书中学习SQL。我已经按照有关联接表数据的说明进行了操作。在这里,我只是尝试将数据回显到页面上,以确保在围绕此数据设置页面样式之前,我的查询是正确的

    <?php
        //Set DB Variables
        $dbc = mysql_connect(host, username, password);
        $db = mysql_select_db(database);
        $results= mysql_query("SELECT 'tbl_games.game_ID', 'tbl_games.game_date', 'tbl_teams.team_name' FROM tbl_teams, tbl_games
            WHERE 'tbl_games.team1_ID' = 'tbl_teams.team_ID' AND 'tbl_games.team2_ID' = 'tbl_teams.team_ID' AND 'tbl_games.team1_score' IS NULL AND 'tbl_games.team2_score' IS NULL");
        while ($row = mysql_fetch_array($results)) {
            foreach ($row as $columnName => $results) {
                echo 'Column name: '.$columnName.' Column data: '.$columnData.'<br/>';
            }
        }
    ?>

查询(PHP代码中)中的那些单引号应为backticks
`
,与创建表的语句中的引号相同

否则,将比较
where
子句中不匹配的文本字符串

另外,我也不太喜欢使用backticks,除非这是绝对必要的。在我看来,这通常会降低SQL语句的可读性。当然,它有它的位置,有些人可能更喜欢一致性而不是可读性,但我不是其中之一:-)

但是,即使您解决了这个问题,您也会遇到以下问题:

WHERE tbl_games.team1_ID = tbl_teams.team_ID
  AND tbl_games.team2_ID = tbl_teams.team_ID
因为你似乎在要求一支球队在所有比赛中与自己对抗,这是我在很多体育比赛中都没有见过的

你需要重新考虑你的要求。例如,如果您只想在一个队(作为第1队或第2队)进行的所有比赛中使用or而不是AND(还可以使用括号确保AND/or的正确混合)

应该是:

        $results= mysql_query("SELECT `tbl_games`.`game_ID`, `tbl_games`.`game_date`, `tbl_teams`.`team_name` FROM tbl_teams, tbl_games
        WHERE `tbl_games`.`team1_ID` = `tbl_teams`.`team_ID` AND `tbl_games`.`team2_ID` = `tbl_teams`.`team_ID` AND `tbl_games`.`team1_score` IS NULL AND `tbl_games`.`team2_score` IS NULL");
您使用了错误的引号类型,
不能在引号内

由于表名或列名都不是保留字,因此可以完全不使用引号:

        $results= mysql_query("SELECT tbl_games.game_ID, tbl_games.game_date, tbl_teams.team_name FROM tbl_teams, tbl_games
        WHERE tbl_games.team1_ID = tbl_teams.team_ID AND tbl_games.team2_ID = tbl_teams.team_ID AND tbl_games.team1_score IS NULL AND tbl_games.team2_score IS NULL");
我认为您可能需要的实际查询是:

SELECT tbl_games.game_ID, tbl_games.game_date, tbl_teams.team_name
FROM tbl_teams, tbl_games
WHERE (tbl_teams.team_ID = tbl_games.team1_ID AND tbl_games.team1_score IS NULL)
OR (tbl_teams.team_ID = tbl_games.team2_ID AND tbl_games.team2_score IS NULL)
这将查找每个球队计划参加的所有比赛,并且他们的分数为空


可能原因:它从两个表(tbl\U团队和tbl\U游戏)中选择数据
条件是tbl_队。team_ID等于team2_ID和team1_ID。除非双方都是同一支球队,否则这是行不通的

您没有指定希望查询返回的内容,因此我假设您只需要两个团队的结果

您可能想要的是一个包含3组数据的连接:游戏、第一队、第二队。在SQL中,这可以使用别名来完成

试试这个:

SELECT tbl_games.game_ID, 
       tbl_games.game_date,
       team1.team_name as "team1_name",
       team2.team_name as "team2_name"
FROM 
    tbl_teams as team1, 
    tbl_teams as team2, 
    tbl_games
WHERE 
    tbl_games.team1_ID = team1.team_ID AND 
    tbl_games.team2_ID = team2.team_ID AND
    tbl_games.team1_score IS NULL AND 
    tbl_games.team2_score IS NULL;
添加“is null”将减少结果。如果所有游戏都有分数,你就不会得到任何结果

查询的另一个潜在问题是字段名位于单引号之间。在实际执行查询之前,我不确定php是否删除了这些内容。如果不是,那就糟糕了;单引号之间的任何内容都被视为字符串。这意味着条件“tbl_games.team1_score”为空实际上是将字符串“tbl_games.team1_score”与空进行比较,而不是将名为team1_score的字段的内容进行比较


编辑:将is NULL添加到where子句中,因为在示例数据中您确实有NULL。

我认为您的查询的问题是在这种情况下
'tbl\u games.team1\u ID'='tbl\u teams.teamu ID'和'tbl\u games.team2\u ID'='tbl\u teams.teamu ID'
。您正在将同一id与两个不同的字段进行比较
tbl\u games.team1\u id
tbl\u games.team2\u id
。 我认为
tbl\u游戏。team1\u ID
是一个团队玩vs
tbl\u游戏。team2\u ID
意思是
tbl\u游戏。team1\u ID!=tbl_games.team2_ID
。所以你只需要两支球队中的一支。 您的查询可能如下所示

<?php
        //Set DB Variables
        $dbc = mysql_connect(host, username, password);
        $db = mysql_select_db(database);
        $results= mysql_query("SELECT tbl_games.game_ID, tbl_games.game_date, tbl_teams.team_name FROM tbl_teams, tbl_games
            WHERE 'tbl_games.team1_ID' = 'tbl_teams.team_ID'  AND 'tbl_games.team1_score' IS NULL AND 'tbl_games.team2_score' IS NULL");
        while ($row = mysql_fetch_array($results)) {
            foreach ($row as $columnName => $results) {
                echo 'Column name: '.$columnName.' Column data: '.$columnData.'<br/>';
            }
        }
    ?>

请参阅以了解如何解决此问题。您在查询中使用了单引号
而不是反引号
`
。感谢您的长篇大论,不过,还有一句话可以将其简化为演示此问题的最简单示例。是的,这是一个负担,因为它要求你像提出问题一样,把问题从最初出现的具体代码中去掉,只创建第二个测试平台,在这个测试平台上从头开始编写问题代码的摘录,并使用尽可能少的代码来重现问题。这不仅会在99.999%的案例中找到答案,而且比你写下这么长的问题还需要更多的工作。好吧,我试着让它更简单:你的问题包含太多的代码。在询问之前,你需要先找出你的问题所在。减少后,您首先也需要搜索。正如您所看到的,它从来不是要添加到线程中,而是完全相反的:从线程中删除。希望您现在就明白了。@Hakre只有大约10行代码,其余的只是他的表模式和示例数据,我们几乎总是在数据库问题中询问这些数据。不可否认,这比我们可能需要的数据要多。这对输出没有任何影响。它仍然不会在屏幕上打印任何内容。基于数据和表结构,是否应该?我可能写错了。
选择tbl_games.games_ID,tbl_games.games_date,tbl_teams.team_名称来自tbl_teams,tbl_games.team1_ID=tbl_teams.teams_ID和tbl_games.teams.team2_ID=tbl_teams.teams_ID
返回0行,但
选择tbl_games.games_ID,tbl_games.games_date,tbl_teams.team_名称来自tbl_teams,tbl_games.team1_ID=tbl_teams.team_ID返回期望的结果,减去每场比赛第2队的sames。更好的是,他应该删除backticks。反勾号没有添加任何内容。感谢指针,我已经更改了所有内容,但结果仍然相同,代码不会在屏幕上打印任何内容。更好的是,他应该删除反勾号。背景标记没有添加任何内容。为什么要从WHERE子句中删除
tbl_games.teamN_分数为NULL
条件?@Barmar:ups,你说得对。我没有看到问题中的例子。我
SELECT tbl_games.game_ID, 
       tbl_games.game_date,
       team1.team_name as "team1_name",
       team2.team_name as "team2_name"
FROM 
    tbl_teams as team1, 
    tbl_teams as team2, 
    tbl_games
WHERE 
    tbl_games.team1_ID = team1.team_ID AND 
    tbl_games.team2_ID = team2.team_ID AND
    tbl_games.team1_score IS NULL AND 
    tbl_games.team2_score IS NULL;
<?php
        //Set DB Variables
        $dbc = mysql_connect(host, username, password);
        $db = mysql_select_db(database);
        $results= mysql_query("SELECT tbl_games.game_ID, tbl_games.game_date, tbl_teams.team_name FROM tbl_teams, tbl_games
            WHERE 'tbl_games.team1_ID' = 'tbl_teams.team_ID'  AND 'tbl_games.team1_score' IS NULL AND 'tbl_games.team2_score' IS NULL");
        while ($row = mysql_fetch_array($results)) {
            foreach ($row as $columnName => $results) {
                echo 'Column name: '.$columnName.' Column data: '.$columnData.'<br/>';
            }
        }
    ?>