2010-08-16 3 views
0

У меня есть этот SQL запрос, и он должен возвращаться два значения, что делает, но он возвращается каждый возвращается строка в два раз, 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 

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

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

-- 
-- 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

Если вы используете 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 
0

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

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

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

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 

Поскольку либо содержание каждого имеет два изображения, каждое OR один содержание имеет одно изображение, а другой имеет три.

+0

Извините, что я не понимаю, что вы имеете в виду. –

+0

. Я расширил свой ответ, чтобы попытаться сделать его более ясным. –

+0

каждый контент будет иметь одно изображение, вот как оно находится в моей базе данных –

2

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

1

попробовать этот

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 ГДЕ mailers. id = 26 ГРУППА ПО mailers. id

Смежные вопросы