我正在學習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」用正確的信息。但是,我測試過它不起作用。
如果有人能給我一個這些問題的燈光,我將不勝感激。
你可能想要的是左連接 – PinnyM 2012-01-13 17:14:08
可以選擇一切從表,以確保你按照正確的順序插入值是多少? – 2012-01-13 17:24:51
LEFT JOIN已經工作,但是當我將它傳遞給PHP時,我將知道哪些「nome」列我必須採取?因爲當我查詢列「nome」沒有混合,然後我有兩列具有相同的標籤。 – 2012-01-13 17:31:05