【问题标题】:sql query is returning the same values twicesql查询两次返回相同的值
【发布时间】:2010-08-16 13:19:29
【问题描述】:

我有这个 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有问题我只是不知道问题是什么

【问题讨论】:

    标签: sql mysql database select left-join


    【解决方案1】:

    如果您使用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】:

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

      【讨论】:

        【解决方案3】:

        试试这个

        mailers中选择* 左连接 mailer_content 开启 mailers.id = mailer_content.mailer_id 左连接 mailer_images 开启 mailer_content.id = mailer_images.content_id 其中mailers.id = 26 分组mailers.id

        【讨论】:

          【解决方案4】:

          对我来说,这看起来不像是 SQL 问题;我怀疑这更有可能归结为您表中的数据。

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

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

          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
          

          因为要么每个内容都有两个图像,要么一个内容有一个图像,另一个有三个。

          【讨论】:

          • 对不起,我没有听懂你的意思
          • 每个内容都有一个图像,这就是它在我的数据库中的样子
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-01-09
          • 1970-01-01
          • 2020-04-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多