2012-09-10 50 views
1

我想从分表中选择所有的分割细节。但我想每个head_user_id,assistant_1_user_id的name_full和assistant_2_user_id将三个外键的MySQL表连接到同一个表

CREATE TABLE IF NOT EXISTS `user_mst` (
    `user_id` int(11) NOT NULL AUTO_INCREMENT, 
    `name_full` varchar(250) DEFAULT NULL, 
    `name_with_initials` varchar(250) DEFAULT NULL, 
    `gender` char(1) NOT NULL, 
    `nic_no` varchar(20) DEFAULT NULL, 
    `title_id` varchar(10) NOT NULL, 
    `dob` date DEFAULT NULL, 
    `address1` varchar(100) DEFAULT NULL, 
    `address2` varchar(100) DEFAULT NULL, 
    `address3` varchar(100) DEFAULT NULL, 
    `address4` varchar(100) DEFAULT NULL, 
    `tele_no` varchar(40) DEFAULT NULL, 
    `mob_no` varchar(40) DEFAULT NULL, 
    `email_personal` varchar(100) DEFAULT NULL, 
    `role_id` varchar(10) NOT NULL, 
    `creator_user_id` varchar(50) NOT NULL, 
    `active_user` tinyint(1) NOT NULL, 
    `emp_no1` varchar(50) DEFAULT NULL, 
    `emp_no2` varchar(50) DEFAULT NULL, 
    `unit_id` varchar(50) DEFAULT NULL, 
    `division_id` varchar(50) DEFAULT NULL, 
    `username` varchar(50) NOT NULL, 
    `password` varchar(50) NOT NULL, 
    `email_official` varchar(45) DEFAULT NULL, 
    PRIMARY KEY (`user_id`), 
    KEY `fk_user_mst_title_mst` (`title_id`), 
    KEY `fk_user_mst_role_mst1` (`role_id`), 
    KEY `fk_user_mst_unit_mst1` (`unit_id`,`division_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ; 

INSERT INTO `user_mst` (`user_id`, `name_full`, `name_with_initials`, `gender`, `nic_no`, `title_id`, `dob`, `address1`, `address2`, `address3`, `address4`, `tele_no`, `mob_no`, `email_personal`, `role_id`, `creator_user_id`, `active_user`, `emp_no1`, `emp_no2`, `unit_id`, `division_id`, `username`, `password`, `email_official`) VALUES 
(2, 'dss', 'ddsf', 'm', '2353246565v', '12', '2012-03-12', 'ewtewt', 'ryery', 'ertert', 'wetwet', '325235325', '23523534523', '[email protected]', '1', '1', 1, '', NULL, '1', '1', 'cde', '123', '[email protected]'), 
(3, 'wrwer', 'egrt', 'f', '2432544663', '12', '2012-03-26', 'erwerw', 'wetw', 'ewtwe', 'ewtw', '132435435', '1243345345', 'dfggdfg', '23', '1', 1, '12', '12', '12', '3', 'pas', '123', 'sdasda'), 
(4, 'asd', 'asd', 'f', '5671234676V', '12', '2012-03-05', 'sdgdsgsd', 'sdgsdgds', 'rgwergwetg', 'ergry', '12141242145', '1242135346', '[email protected]', '1', '123567', 1, '1234', '123', '1', '1', 'abc', '234', '[email protected]');  

    CREATE TABLE IF NOT EXISTS `division_mst` (
    `division_id` varchar(50) NOT NULL, 
    `division_code` varchar(50) NOT NULL, 
    `name` varchar(100) NOT NULL, 
    `description` varchar(500) DEFAULT NULL, 
    `colour` varchar(50) DEFAULT NULL, 
    `head_user_id` int(11) DEFAULT NULL, 
    `assistant_1_user_id` int(11) DEFAULT NULL, 
    `assistant_2_user_id` int(11) DEFAULT NULL, 
    `main_division_id` int(11) DEFAULT NULL, 
    PRIMARY KEY (`division_id`), 
    KEY `fk_division_mst_user_mst1` (`head_user_id`), 
    KEY `fk_division_mst_user_mst2` (`assistant_1_user_id`), 
    KEY `fk_division_mst_user_mst3` (`assistant_2_user_id`), 
    KEY `fk_division_mst_main_division_mst1` (`main_division_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

INSERT INTO `division_mst` (`division_id`, `division_code`, `name`, `description`, `colour`, `head_user_id`, `assistant_1_user_id`, `assistant_2_user_id`, `main_division_id`) VALUES 
('1', 'D001', 'Administration', 'tjrtujrt', 'pink', 1, 2, NULL, 1), 
('2', 'D002\n', 'Human Resource\n', 'yjghkhk', 'red', 1, 3, 2, 1), 
('3', 'D003', 'Marketing', 'jhghfg', 'green', 2, 1, 3, 2), 
('4', 'D004', 'IT ', NULL, NULL, NULL, NULL, NULL, NULL), 
('5', 'D005', 'Accounting ', NULL, NULL, NULL, NULL, NULL, NULL); 
+2

FYI它看起来像你的外键是因为通常错误地创建时,外键已经被正确创建,你会看到类似约束'blah_ibfk_' FOREIGN KEY('blah_id')REFERENCES'blah'('id') – hsanders

+0

[你试过什么?](http://www.whathaveyoutried.com) – Kermit

+0

@hsanders是的。但我需要SELECT查询。 head_user_id,assistant_1_user_id和assistant_2_user_id对user_mst(user_id)的所有引用。 –

回答

1
select 
    d.*, 
    u1.name_full AS head_user, 
    u2.name_full AS assistant1, 
    u3.name_full AS assistant2 
from division_mst d 
    LEFT OUTER JOIN user_mst u1 ON d.head_user_id=u1.user_id 
    LEFT OUTER JOIN user_mst u2 ON d.assistant_1_user_id=u2.user_id 
    LEFT OUTER JOIN user_mst u3 ON d.assistant_2_user_id=u3.user_id 
+0

此结果为零部门详细信息,其空值为name_full和name_full详细信息,且为空部门值。 –

+0

我知道。我更新了我的答案。使用上面的新代码。我曾经参考过u1 3次,我应该在其他连接中使用u2和u3。 –

+0

现在它工作正常。非常感谢Domenic D.非常感谢你! –

1

试试这个,

SELECT b.`name_full` head_user, 
     c.`name_full` assistant_1, 
     d.`name_full assistant_2 
FROM `division_mst` a 
     INNER JOIN `user_mst` b 
      ON a.`head_user_id` = b.`user_id` 
     INNER JOIN `user_mst` c 
      ON a.`assistant_1_user_id` = b.`user_id` 
     INNER JOIN `user_mst` d 
      ON a.`assistant_2_user_id` = b.`user_id` 

希望这有助于。

顺便说一句,你的约束应该是这样的

CONSTRAINT `fk_division_mst_user_mst1` FOREIGN KEY (`head_user_id`) REFERENCES `user_mst`(user_id), 
    CONSTRAINT `fk_division_mst_user_mst2` FOREIGN KEY (`assistant_1_user_id`) REFERENCES `user_mst`(user_id), 
    CONSTRAINT `fk_division_mst_user_mst3` FOREIGN KEY (`assistant_2_user_id`) REFERENCES `user_mst`(user_id) 
+0

我无法得到部门的详细信息 –

+0

INNER JOIN不会工作,因为他们最终会排斥对方。我相信你必须使用外连接。 –

+0

你是什么意思排除对方? –