Таблицы: Животные, Клетки, Смотрители.
Цель: по заданному animalsID
получить все значения из каждой таблицы. Вроде бы написал, возможно неоптимальный, работает.
НО, у Animal
может отсутствовать смотритель, и тогда мы просто получим NULL
.
Вопрос: как при отсутствии чего-либо получить хотя бы остальные данные?
CREATE TABLE `animal` (
`id` int(11) NOT NULL,
`name` varchar(50) NOT NULL,
`animalClass` varchar(50) NOT NULL,
`age` INT(11) NOT NULL,
CONSTRAINT pk_animal PRIMARY KEY (id)
) ENGINE=MyISAM;
CREATE TABLE `keeper` (
`keeperID` INT(11) NOT NULL,
`name` VARCHAR(50) NOT NULL,
`surname` VARCHAR(50) NOT NULL,
CONSTRAINT pk_keeper PRIMARY KEY (keeperID)
)ENGINE=MyISAM;
CREATE TABLE `keeper_animals` (
`animalID` INT (11) NOT NULL,
`keeperID` INT (11) NOT NULL,
FOREIGN KEY (animalID) REFERENCES animal(id),
FOREIGN KEY (keeperID) REFERENCES keeper(keeperID),
UNIQUE (animalID, keeperID)
)ENGINE=MyISAM;
CREATE TABLE `cage` (
`cageID` INT(11) NOT NULL,
`number` VARCHAR(50) NOT NULL,
CONSTRAINT pk_cage PRIMARY KEY (cageID)
) ENGINE=MyISAM;
CREATE TABLE `cage_animals` (
`animalID` INT(11) NOT NULL,
`cageID` INT(11) NOT NULL,
FOREIGN KEY (animalID) REFERENCES animal (id),
FOREIGN KEY (cageID) REFERENCES cage(cageID),
UNIQUE (animalID, cageID)
) ENGINE=MyISAM;
Сам запрос (быть может его не так пишут?):
SELECT
animal.id, animal.name, animal.animalClass, animal.age,
keeper.keeperID, keeper.name, keeper.surname,
cage.cageID, cage.number
FROM animal
INNER JOIN keeper_animals ON animal.id = keeper_animals.animalID
INNER JOIN keeper ON keeper_animals.keeperID = keeper.keeperID
INNER JOIN cage_animals ON animal.id = cage_animals.animalID
INNER JOIN cage ON cage_animals.cageID = cage.cageID
WHERE id = "Необходимый ID";
Внешнее соединение LEFT JOIN означает, что помимо строк, для которых выполняется условие предиката, в результирующий набор попадут все остальные строки из первой таблицы (левой). При этом отсутствующие значения столбцов из правой таблицы будут заменены NULL-значениями.
sql-tutorial
Так что
INNER JOIN keeper_animals ON animal.id = keeper_animals.animalID
INNER JOIN keeper ON keeper_animals.keeperID = keeper.keeperID
заменяем на
LEFT JOIN keeper_animals ON animal.id = keeper_animals.animalID
LEFT JOIN keeper ON keeper_animals.keeperID = keeper.keeperID
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Имеется html таблица которая отоброжает ланные с базы данных вертикально и горизонтальноОтоброжается только никнейм, нужно добавить полное...
Есть несколько одинаковых таблиц в базеКак сделать запрос из всех? Вот запрос на выбор из одной:
ЗдравствуйтеВ разных частях моего php-скрипта я выполняю запросы к БД MySQL