2010-08-26 48 views
0

我有这个结构3个表的数据库正从3个表中的数据,通过重复ID

CREATE TABLE `mailers` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `mailer_title` varchar(150) NOT NULL, 
    `mailer_header` varchar(60) NOT NULL, 
    `mailer_type` enum('single','multi') NOT NULL, 
    `introduction` varchar(80) NOT NULL, 
    `status` enum('live','dead','draft') NOT NULL, 
    `flag` enum('sent','unsent') NOT NULL, 
    `date_mailer_created` int(11) NOT NULL, 
    `date_mailer_updated` int(10) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=48 ; 

CREATE TABLE `mailer_content` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `headline` varchar(320) NOT NULL, 
    `content` text NOT NULL, 
    `mailer_id` int(11) NOT NULL, 
    `position` enum('left','right','centre') DEFAULT NULL, 
    `tab_1_name` varchar(25) DEFAULT NULL, 
    `tab_1_link` varchar(250) DEFAULT NULL, 
    `tab_2_name` varchar(25) DEFAULT NULL, 
    `tab_2_link` varchar(250) DEFAULT NULL, 
    `tab_3_name` varchar(25) DEFAULT NULL, 
    `tab_3_link` varchar(250) DEFAULT NULL, 
    `tab_4_name` varchar(25) DEFAULT NULL, 
    `tab_4_link` varchar(250) DEFAULT NULL, 
    `created_at` int(10) NOT NULL, 
    `updated_at` int(10) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `mailer_id` (`mailer_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=54 ; 

CREATE TABLE `mailer_images` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `title` varchar(150) NOT NULL, 
    `filename` varchar(150) NOT NULL, 
    `mailer_id` int(11) NOT NULL, 
    `content_id` int(11) DEFAULT NULL, 
    `date_created` int(10) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=92 ; 

ALTER TABLE `mailer_content` 
    ADD CONSTRAINT `mailer_content_ibfk_1` 
    FOREIGN KEY (`mailer_id`) 
    REFERENCES `mailers` (`id`) ON DELETE CASCADE ON UPDATE CASCADE; 

我怎么会得到所有列,其中ID和邮件表47中的所有数据?我现在有这个SQL,我现在有这个SQL语句,但没有返回正确的数据,

SELECT * 
    FROM `mailers` 
LEFT JOIN `mailer_content` ON `mailers`.`id` = `mailer_content`.`mailer_id` 
LEFT JOIN `mailer_images` ON `mailer_content`.`id` = `mailer_images`.`content_id` 
    WHERE `mailers`.`id` = 47 
+0

您将不得不解释为什么从您的查询返回的数据不正确。 – 2010-08-26 19:53:49

+0

基本上我期待3行被返回,但它返回6,但6行是我期望重复的3。使用DISTINCT不会确定您的数据是否正确, – 2010-08-26 20:13:54

+0

什么都没有,邮件中没有重复项? – pixeline 2010-08-26 21:09:07

回答

0

您省略mailer_images连接条件:

SELECT * 
    FROM `mailers` 
LEFT JOIN `mailer_content` ON `mailers`.`id` = `mailer_content`.`mailer_id` 
LEFT JOIN `mailer_images` ON `mailer_content`.`id` = `mailer_images`.`content_id` 
         AND `mailers`.`id` = `mailer_images`.`mailer_id` 
    WHERE `mailers`.`id` = 47 
0

试试这个

SELECT * 
    FROM `mailers` 
LEFT JOIN `mailer_content` ON `mailers`.`id` = `mailer_content`.`mailer_id` 
LEFT JOIN `mailer_images` ON `mailer_images`.`mailer_id` = `mailer`.`id` 
    WHERE `mailers`.`id` = 47 
+0

即返回4行,但它只有2行重复 – 2010-08-26 20:42:03