SQL-запрос возвращает одни и те же значения дважды - PullRequest
0 голосов
/ 16 августа 2010

У меня есть этот запрос 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` = 26

Структура таблицы для таблиц Iзапрос выглядит так:

    -- --------------------------------------------------------

--
-- Table structure for table `mailers`
--

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=29 ;

-- --------------------------------------------------------

--
-- Table structure for table `mailer_content`
--

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=16 ;

-- --------------------------------------------------------

--
-- Table structure for table `mailer_images`
--

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=49 ;

Я уверен, что это должно быть проблема с моим SQL Я просто не знаю, в чем проблема

Ответы [ 4 ]

4 голосов
/ 16 августа 2010

Если вы используете SELECT DISTINCT SQL не будет возвращать дублированные строки, если они есть.

SELECT DISTINCT * 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` = 26
2 голосов
/ 17 августа 2010

U может использовать group by smthng . Это удалит те же записи. но вы можете удалить не те же строки. Используйте smthng без одинаковых значений в разных строках исходной таблицы.

1 голос
/ 20 ноября 2013

попробуйте

ВЫБРАТЬ * ОТ mailers LEFT JOIN mailer_content ON mailers. id = mailer_content. mailer_id LEFT JOIN mailer_images ON mailer_content. id = mailer_images. content_id ГДЕ mailers. id = 26 ГРУППА ПО mailers. id

0 голосов
/ 16 августа 2010

Для меня это не похоже на SQL; Я подозреваю, что это, скорее всего, связано с данными в ваших таблицах.

Я предполагаю, что есть две строки в mailer_content, где mailers.id = 26, а затем две строки (или, возможно, 1 и 3) в mailer_images для каждой из mailer_content s.

Сколько строк возвращает каждый из следующих запросов?

SELECT * FROM `mailers`
WHERE `mailers`.`id` = 26  

SELECT * FROM `mailer_content`
WHERE `mailer_content`.`id` = 26

Я предполагаю, что первая возвращает 1 строку (потому что у нее есть первичный ключ на id), а вторая возвращает две строки.

Все может быть хорошо, но я предполагаю, что следующий запрос возвращает 4 записи:

SELECT * FROM `mailer_content`
LEFT JOIN `mailer_images` ON `mailer_content`.`id` = `mailer_images`.`content_id`
WHERE `mailer_content`.`id` = 26

Поскольку либо у каждого контента есть два изображения каждое, ИЛИ у одного контента есть одно изображение, а у другого - три.

...