получение данных из 3 таблиц через повторяющийся идентификатор

0

У меня есть база данных с 3 таблицами в этой структуре,

    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
    Вам нужно будет объяснить, почему данные, возвращаемые по вашему запросу, неверны.
  • 0
    По сути, я ожидаю, что будут возвращены 3 строки, однако возвращается 6, но 6 строк - это 3, которые я ожидал повторить. Использование DISTINCT тоже ничего не дает
Показать ещё 4 комментария
Теги:
database
join
relational-database

2 ответа

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 строки

Ещё вопросы

Сообщество Overcoder
Наверх
Меню