sql查询返回两次相同的值

时间:2010-08-16 13:19:29

标签: sql mysql database select left-join

我有这个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 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

你可以使用按smthng分组。它将删除相同的记录。 但是你可以删除非行。在原始表的不同行中使用没有相同值的smthng。

答案 2 :(得分:1)

试试这个

SELECT * FROM mailers   LEFT JOIN mailer_content点击mailersid = mailer_contentmailer_id   LEFT JOIN mailer_images点击mailer_contentid = mailer_imagescontent_idmailersid = 26 GROUP BY mailersid

答案 3 :(得分:0)

对我而言,它看起来不像SQL;我怀疑这更有可能归结为表格中的数据。

我的猜测是,mailer_content中有两行mailers.id = 26,然后mailer_images中的每一行mailer_content中有两行(或可能是1和3)

以下每个查询返回多少行?

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

因为每个内容每个都有两个图像,或者一个内容有一个图像而另一个内容有三个。