SQL查询返回错误的结果

时间:2014-02-24 04:29:19

标签: php mysql sql phpmyadmin

在我的网站上,用户可以从32名玩家中选出一名玩家。首发阵容中有15个位置,因此在32名球员阵容中需要选择15名球员。

1玩家可以玩多个位置,如下图所示:

enter image description here

现在当用户从小队中选择起跑线时,某个可以打多于1个位置的球员名称(如上图所示)需要出现在两个位置,不幸的是这不适合你可以在下图中看到:

enter image description here

如果你看一下图像1,你可以看到Badden Kerr可以同时玩flyhalf和后卫。

问题

在选择列表中,播放器的辅助位置不会显示。作为一个例子如果再看一下图像1,你可以看到Badden Kerr可以同时玩flyhalf和后卫。但在第二张图片中,后卫位置为空,而巴登科尔斯的名字并未出现在他的次要位置(后卫)


当我在Phpmyadmin中运行以下sql语句时:

SELECT *
FROM `allsquads`
WHERE `Team` = 'Blues'
AND `Position` = 'flyhalf'
AND `Secondary` = 'fullback'

我收到了正确的结果,如下图所示: enter image description here

然而,当我尝试在我的PHP代码中运行相同的SQL语句时,它会给我错误/不需要的结果(如图2所示)

我的PHP代码如下:

// assign each position to array variable position
        $position = array(
            "prop",
            "hooker",
            "prop",
            "lock",
            "lock",
            "flank",
            "flank",
            "no8",
            "scrumhalf",
            "flyhalf",
            "center",
            "center",
            "wing",
            "wing",
            "fullback"
        );
        // for loop to loop through the number of positions in the team, which will be used to query DB
        $size     = sizeof($position);
        for ($i = 0; $i < $size; $i++) {
            // Query For positions
            $sqlprops = mysql_query("SELECT * FROM `allsquads` 
                                     WHERE `Team` = '$t1select'  
                                     AND `Position` = '$position[$i]' 
                                     OR `Secondary` = '$position[$i]'") or die(mysql_error());

新问题 当我执行以下查询

SELECT * FROM `allsquads` 
                               WHERE `Team` = '$t1select'  
                                AND `Position` = '$position[$i]' 
                                OR `Secondary` = '$position[$i]'") or die(mysql_error());

查询现在显示两个位置的玩家,但是它显示不在选择团队中的其他玩家?

非常感谢任何帮助或建议

提前谢谢

2 个答案:

答案 0 :(得分:4)

您在PHP代码中的查询不会产生所需的结果,因为您将PositionSecondary设置为相同的值。根据您提供的样本数据,不会返回任何内容。

如果您正在寻找一个查询来为dropdwon选择合格的玩家,您可以将查询更改为:

SELECT * FROM `allsquads` 
WHERE `Team` = '$t1select'  
AND (`Position` = '$position[$i]' OR `Secondary` = '$position[$i]')

答案 1 :(得分:1)

您应优化数据库结构。虽然有办法解决你想出的问题,但我认为最好规范你的牌桌,这样你就有了一张牌桌和一张不同的牌桌,牌桌上有玩家ID和可能的位置(如果你真的关心的话)它是主要或次要的位置,你也可以为它添加一个字段。

所以你的players表将是

╔═══════════╦═════════════╗
║ player_id ║ player_name ║
╠═══════════╬═════════════╣
║ 1         ║ John Doe    ║
╚═══════════╩═════════════╝

如果需要还可以使用更多;通过阅读这个问题,我不清楚你的结构的其余部分。 positions表将是:

╔═══════════╦═══════════╦═══════════╗
║ player_id ║ position  ║ role      ║
╠═══════════╬═══════════╬═══════════╣
║ 1         ║ flyhalf   ║ primary   ║
║ 1         ║ fullback  ║ secondary ║
╚═══════════╩═══════════╩═══════════╝

然后找到所有玩flyhalf的玩家,你会查询select `players`.`player_name` from `players`,`positions` where `positions`.`position` = "flyhalf" and `players`.`player_id`=`position`.`plr_id`

此外,您可以(并且可能应该)将位置名称规范化为另一个表,因此positions.position是一个整数引用表possible_positions

╔════════╦═══════════╗
║ pos_id ║ position  ║
╠════════╬═══════════╣
║ 1      ║ flyhalf   ║
║ 2      ║ fullback  ║
╚════════╩═══════════╝

此外,这样做可以让您保留数据库中可能的位置列表和数据库查询,而不是像现在一样硬编码到PHP数组中。

至少,这应该让你开始。数据库规范化并从一开始就具有适当的结构可能对构建这些查询有很大帮助。