Выборка из Many-to-many таблиц по заданному ID

246
21 декабря 2016, 01:54

Таблицы: Животные, Клетки, Смотрители.

Цель: по заданному 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";
Answer 1

Внешнее соединение 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
READ ALSO
Добавить больше данных в html таблицу

Добавить больше данных в html таблицу

Имеется html таблица которая отоброжает ланные с базы данных вертикально и горизонтальноОтоброжается только никнейм, нужно добавить полное...

247
SQL сложный запрос “один ко многим”

SQL сложный запрос “один ко многим”

СитуацияИмеем 3 таблицы

287
Запрос в MySQL и выбор из нескольких таблиц

Запрос в MySQL и выбор из нескольких таблиц

Есть несколько одинаковых таблиц в базеКак сделать запрос из всех? Вот запрос на выбор из одной:

303
Обработка ошибок MySQL в PHP

Обработка ошибок MySQL в PHP

ЗдравствуйтеВ разных частях моего php-скрипта я выполняю запросы к БД MySQL

263