Как выполнить объединение MYSQL для двух таблиц, где условие для значения внешнего ключа для второй таблицы также может быть нулевым - PullRequest
0 голосов
/ 14 января 2019

У меня есть таблица, которая содержит два внешних ключа. Мне нужно иметь возможность запрашивать эту таблицу и выполнять объединения, чтобы получить данные из других таблиц. У меня проблема в том, что второй внешний ключ, ну, я установил его как обнуляемый.

Мой стол выглядит примерно так ...

CREATE TABLE orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    fk_meal INT NOT NULL, -- Foreign key to meals table
    fk_drink INT NULL -- Foreign key to drinks table
);

Заказ можно разместить с напитком или без. Еда обязательна, а напиток - нет. Я хотел бы иметь возможность получать данные из базы данных, даже если fk_drink равно NULL. Я пытаюсь это сделать с помощью следующего запроса ...

SELECT * FROM orders 
INNER JOIN meals ON meals.id = orders.fk_meal 
LEFT JOIN drinks ON (drinks.id = orders.fk_drink OR orders.fk_drink = NULL)

Запрос запускается нормально, и я получаю данные обратно, но когда fk_drink равен NULL, я получаю объект, содержащий ТОЛЬКО идентификатор. Когда fk_drink фактически содержит напиток, я получаю все данные отлично.

Есть ли способ вернуть все остальные данные и NULL для fk_drink, когда нет напитков или есть какой-то лучший способ справиться с этим? Ваша помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 14 января 2019

Проверка orders.fk_drink = NULL неверна и должна быть:

orders.fk_drink IS NULL

Однако эта проверка даже не нужна, и вы должны использовать этот запрос:

SELECT *
FROM orders o
INNER JOIN meals m
    ON m.id = o.fk_meal
LEFT JOIN drinks d
    ON d.id = o.fk_drink;

Возвращаясь к исходному коду orders.fk_drink = NULL, проблема сравнения fk_drink с NULL напрямую с использованием оператора = заключается в том, что это сравнение само по себе неизвестно. Это означает, что вы, возможно, неправильно фиксируете записи, не прошедшие левое соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...