извлекать несуществующую строку как NULL при присоединении

0

Я просто хочу знать, как я могу получить несуществующую строку в таблице и вернуть ее как 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;
}

Спасибо, Патрик!

Теги:
mysqli
prepared-statement

1 ответ

0
Лучший ответ

Переместите 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 которую данный пользователь не имеет. Вместо этого вы хотите показать каждую запись умения, независимо от того, имеет ли пользователь этот навык.

  • 0
    Перемещение WHERE предложению ON объединяет данные, которые даже не связаны с этим конкретным user_id, хотя он возвращает NULL, но в строку, не связанную с user_id. Если я не достаточно ясно, я пытаюсь загрузить все эти поля из skill_type, существуют ли они в skill_players, если они существуют, вернуть значение из поля, и если они не существуют, вернуть NULL в качестве значения.
  • 0
    @ Патрик Извините ... Я думал, что у вас уже был правильный порядок соединения, которого у вас нет. Вы должны присоединять навыки к игрокам, в таком порядке.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню