php - JOINED 时将不存在的行检索为 NULL

标签 php mysql mysqli prepared-statement

我只是想知道,如何检索表中不存在的行并将其返回为 NULL?

简介

例如,在下面的代码中,它只会返回 Skill_players 中存在的数据,这不是我想要的结果。我想要的结果是,输出现有数据以从 skill_players 获取其值(如果不存在),然后将该值输出为 NULL,以便我可以使用IFNULL 供以后使用。

表格设计

skills_type

skill_players

当前结果

[Skill Name]        | [Value]
TotalStoreRobbed    |  8

预期结果

[Skill Name]        | [Value]
TotalRape           |  NULL
TotalBeenRaped      |  NULL
TotalRob            |  NULL
TotalBeenRobbed     |  NULL
TotalStoreRobbed    |  8
TotalCuffEscape     |  NULL
TotalArrest         |  NULL
TotalBeenArrested   |  NULL

代码

//fetching item data
$query =
"
    SELECT
        skill.value, type.skill_name
    FROM
        skills_player AS skill
    LEFT JOIN
        skills_type AS type
    ON
        skill.fk_skill_id = type.skill_id
    WHERE
        skill.fk_user_id = ?
";
if($stmt = $sqlHandle->prepare($query))
{
    $stmt->bind_param("i", $acc_ID);
    $stmt->execute();
    $res = $stmt->get_result();

    $skills = null;
    if($res->num_rows > 0) {
        while($row = $res->fetch_assoc()) {
            $skills[] = $row;
            print_r($row);
        }
    }
}
else {
    $error = $sqlHandle->errno . ' ' . $sqlHandle->error;
    echo $error;
}

谢谢,帕特里克!

最佳答案

WHERE 子句移至 ON 子句,并更改联接顺序。将连接技能留给玩家,从而保留所有技能。

SELECT
    skill.value, type.skill_name
FROM
    skills_type AS type
LEFT JOIN
    skills_player AS skill
ON
    skill.fk_skill_id = type.skill_id AND
    skill.fk_user_id = ?

当前查询的问题在于,虽然它确实使用了LEFT JOIN,但它会丢弃skills_player表中给定用户没有的任何记录。相反,您希望显示每条技能记录,无论用户是否拥有该技能。

关于php - JOINED 时将不存在的行检索为 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47965224/

相关文章:

mysql - mysql 查询运行需要双别名

mysqli - 使用 mysqli 获取准备好的语句的实际 SQL?

php - 从 MYSQL 更新到 MYSQLI

php - 渲染 Zend\Form\Element\Button 有内容但没有标签

php - 将 mysql 结果返回到 php 字符串

php - Codeigniter + Mysql Active Record 查询 ASC DESC 顺序

php - SELECT、SELECT COUNT 和交叉引用表是否可以仅由一个查询处理?

php - 从 Kendo Treeview 选择的节点中检索 id

php - MYSQL重复行

php - MySQL 和 PHP 插入和更新并立即检索新值