2012-01-13 2 views
1

Сейчас я изучаю 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» из базы данных с правильной информацией. Но так как я тестировал, это не сработало.

Если кто-то может дать мне свет с этими проблемами, я буду благодарен.

+0

То, что вы, вероятно, хотите это LEFT JOIN – PinnyM

+0

вы можете выбрать все из таблиц, чтобы убедиться, что вы вставили значение в правильном порядке? –

+0

LEFT JOIN работал, но когда я передаю его PHP, как я узнаю, какой из столбцов «nome» я должен взять? Потому что, когда я делал запрос, столбцы «nome» не смешивались, а затем у меня было два столбца с одним и тем же ярлыком. –

ответ

0

Ситуация, с которой вы столкнулись, состоит в том, что неквалифицированный JOIN на самом деле интерпретируется как INNER JOIN для получения более подробной информации о documentation.

Так при запуске запроса строки не содержащее соответствие token от objetos отбрасываются, а затем, так как не знак из civis матча token из empresas всех строки отбрасываются.

Так от того, что я понимаю, вы пытаетесь сделать вам на самом деле нужно сделать LEFT JOIN, если вы хотите, чтобы получить все столбцы из всех таблиц или отделить этот один запрос в нравится так:

SELECT * FROM objetos o JOIN civis c ON (o.token_dono = c.token); 

и

SELECT * FROM objetos o JOIN empresas e ON (o.token_dono = e.token); 
+0

Я использовал его и СОЮЗ, чтобы сделать то, что я хочу. Спасибо, люди. –

Смежные вопросы