Сейчас я изучаю MySQL JOINs, и одна вещь, которую я хочу знать, - это СОЕДИНЕНИЕ двух дочерних таблиц с одной таблицей отца.MySQL JOIN проблемы с двумя дочерними таблицами
В этом случае запрос состоит в следующем:
SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @[email protected]@SQL_MODE, SQL_MODE='TRADITIONAL';
DROP SCHEMA IF EXISTS `test` ;
CREATE SCHEMA IF NOT EXISTS `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `test`;
CREATE TABLE IF NOT EXISTS `test`.`objetos` (
`idobjetos` INT(11) NOT NULL AUTO_INCREMENT ,
`modelo` VARCHAR(45) NULL DEFAULT NULL ,
`descricao` VARCHAR(45) NULL DEFAULT NULL ,
`token_dono` VARCHAR(41) NOT NULL ,
PRIMARY KEY (`idobjetos`, `token_dono`) ,
INDEX `token_dono` (`token_dono` ASC))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;
CREATE TABLE IF NOT EXISTS `test`.`empresas` (
`idempresa` INT(11) NULL DEFAULT NULL AUTO_INCREMENT ,
`nome` VARCHAR(45) NULL DEFAULT NULL ,
`cnpj` VARCHAR(45) NULL DEFAULT NULL ,
`email` VARCHAR(45) NULL DEFAULT NULL ,
`telefone` VARCHAR(45) NULL DEFAULT NULL ,
`token` VARCHAR(41) NOT NULL ,
PRIMARY KEY (`idempresa`, `token`) ,
INDEX `token_empresa` (`token` ASC) ,
UNIQUE INDEX `cnpj_UNIQUE` (`cnpj` ASC) ,
UNIQUE INDEX `email_UNIQUE` (`email` ASC) ,
UNIQUE INDEX `telefone_UNIQUE` (`telefone` ASC) ,
CONSTRAINT `token_empresa`
FOREIGN KEY (`token`)
REFERENCES `test`.`objetos` (`token_dono`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;
CREATE TABLE IF NOT EXISTS `test`.`civis` (
`idcivil` INT(11) NOT NULL AUTO_INCREMENT ,
`nome` VARCHAR(45) NULL DEFAULT NULL ,
`cpf` VARCHAR(45) NULL DEFAULT NULL ,
`email` VARCHAR(45) NULL DEFAULT NULL ,
`token` VARCHAR(41) NOT NULL ,
PRIMARY KEY (`idcivil`, `token`) ,
INDEX `token_civil` (`token` ASC) ,
UNIQUE INDEX `cpf_UNIQUE` (`cpf` ASC) ,
UNIQUE INDEX `email_UNIQUE` (`email` ASC) ,
CONSTRAINT `token_civil`
FOREIGN KEY (`token`)
REFERENCES `test`.`objetos` (`token_dono`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;
CREATE TABLE IF NOT EXISTS `test`.`an_users` (
`id` INT(11) NULL DEFAULT NULL AUTO_INCREMENT ,
`usuario` VARCHAR(45) NULL DEFAULT NULL ,
`senha` VARCHAR(45) NULL DEFAULT NULL ,
`cod_usuario` INT(11) NOT NULL ,
PRIMARY KEY (`id`, `cod_usuario`) ,
INDEX `cod_usuario_fk` (`cod_usuario` ASC) ,
CONSTRAINT `cod_usuario_fk`
FOREIGN KEY (`cod_usuario`)
REFERENCES `test`.`empresas` (`idempresa`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;
SET [email protected]_SQL_MODE;
SET [email protected]_FOREIGN_KEY_CHECKS;
SET [email protected]_UNIQUE_CHECKS;
И я вставил эти значения:
INSERT INTO `mydb`.`objetos` VALUES (NULL, 'Cadeira XTT', 'Quê?', SHA1(CONCAT(3913123612,'[email protected]')));
INSERT INTO `mydb`.`objetos` VALUES (NULL, 'Mesa TTX', 'Hein?', SHA1(CONCAT(4313123612,'[email protected]')));
INSERT INTO `mydb`.`objetos` VALUES (NULL, 'Prédio TT', 'Hein?', SHA1(CONCAT(73358847000116,'[email protected]')));
INSERT INTO `mydb`.`civis` VALUES (NULL, 'One', 3913123612, '[email protected]', SHA1(CONCAT(3913123612,'[email protected]')));
INSERT INTO `mydb`.`civis` VALUES (NULL, 'Two', 4313123612, '[email protected]', SHA1(CONCAT(4313123612,'[email protected]')));
INSERT INTO `mydb`.`empresas` VALUES(NULL, 'Buzz', 73358847000116, '[email protected]', 33270743, SHA1(CONCAT(73358847000116,'[email protected]')));
Но есть некоторые проблемы, когда я хочу, чтобы получить записанные данные. NATURAL JOIN не работает, как и следовало ожидать, принимая только те строки, с тем же самым, и я не могу на это:
SELECT *
FROM objetos
JOIN civis
ON(objetos.token_dono = civis.token)
JOIN empresas
ON(objetos.token_dono = empresas.token)
Чтобы получить список все «Objetos» из базы данных с правильной информацией. Но так как я тестировал, это не сработало.
Если кто-то может дать мне свет с этими проблемами, я буду благодарен.
То, что вы, вероятно, хотите это LEFT JOIN – PinnyM
вы можете выбрать все из таблиц, чтобы убедиться, что вы вставили значение в правильном порядке? –
LEFT JOIN работал, но когда я передаю его PHP, как я узнаю, какой из столбцов «nome» я должен взять? Потому что, когда я делал запрос, столбцы «nome» не смешивались, а затем у меня было два столбца с одним и тем же ярлыком. –