MySQL JOIN проблемы с двумя дочерними таблицами - PullRequest
1 голос
/ 13 января 2012

Сейчас я изучаю соединения MySQL, и я хочу знать одну вещь: как объединить две дочерние таблицы с одной родительской таблицей.

В этом случае запрос выглядит так:

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@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 SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

И я вставил эти значения:

INSERT INTO `mydb`.`objetos` VALUES (NULL, 'Cadeira XTT', 'Quê?', SHA1(CONCAT(3913123612,'one@gmail.com')));
INSERT INTO `mydb`.`objetos` VALUES (NULL, 'Mesa TTX', 'Hein?', SHA1(CONCAT(4313123612,'two@gmail.com')));
INSERT INTO `mydb`.`objetos` VALUES (NULL, 'Prédio TT', 'Hein?', SHA1(CONCAT(73358847000116,'buzz@gmail.com')));

INSERT INTO `mydb`.`civis` VALUES (NULL, 'One', 3913123612, 'one@gmail.com', SHA1(CONCAT(3913123612,'one@gmail.com')));
INSERT INTO `mydb`.`civis` VALUES (NULL, 'Two', 4313123612, 'two@gmail.com', SHA1(CONCAT(4313123612,'two@gmail.com')));

INSERT INTO `mydb`.`empresas` VALUES(NULL, 'Buzz', 73358847000116, 'buzz@gmail.com', 33270743, SHA1(CONCAT(73358847000116,'buzz@gmail.com')));

Но есть некоторые проблемы, когда я хочу получить записанные данные. НАТУРАЛЬНОЕ СОЕДИНЕНИЕ не работает должным образом, беря только строки с одинаковым токеном, и я не могу к этому:

SELECT * 
FROM objetos 

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

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

Для отображения всех "объектов" из базы данных с правильной информацией. Но, как я уже проверял, это не работает.

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

1 Ответ

0 голосов
/ 13 января 2012

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

Поэтому, когда вы выполняете запрос, строка несодержащий совпадающие token из objetos удаляется, а затем, поскольку токен из civis match 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...