2012-01-13 44 views
1

我正在學習MySQL JOIN現在,我想知道的一件事是如何加入一個父表兩個子表。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]'))); 

但也存在一些問題,當我要檢索的記錄的數據。自然連接不工作的預期,同時只能用同樣的行,我不能這樣:

SELECT * 
FROM objetos 

JOIN civis 
ON(objetos.token_dono = civis.token) 

JOIN empresas 
ON(objetos.token_dono = empresas.token) 

要列出從數據庫中的所有「objetos」用正確的信息。但是,我測試過它不起作用。

如果有人能給我一個這些問題的燈光,我將不勝感激。

+0

你可能想要的是左連接 – PinnyM 2012-01-13 17:14:08

+0

可以選擇一切從表,以確保你按照正確的順序插入值是多少? – 2012-01-13 17:24:51

+0

LEFT JOIN已經工作,但是當我將它傳遞給PHP時,我將知道哪些「nome」列我必須採取?因爲當我查詢列「nome」沒有混合,然後我有兩列具有相同的標籤。 – 2012-01-13 17:31:05

回答

0

您遇到的情況是不合格的JOIN實際上被解釋爲INNER JOIN請參閱documentation瞭解更多詳細信息。

所以,當你運行你的查詢不包含行匹配的從objetostoken被丟棄,然後由於從civis比賽tokenempresas沒有令牌的所有行被刪除。

所以從我收集你正在嘗試做的,你實際上需要做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

我用它和聯盟來做我想做的。謝謝你們。 – 2012-01-16 16:14:36