2015-05-23 93 views
0

我有两个表,用户和主题。使用select时子查询返回多于1行的mysql

表用户

CREATE TABLE IF NOT EXISTS `user` (
    `userid` int(11) NOT NULL AUTO_INCREMENT, 
    `usertype` int(11) DEFAULT '0', 
    `useraccesskey` varchar(80) DEFAULT NULL, 
    `userphone` varchar(80) DEFAULT NULL, 
    `userpassword` varchar(80) DEFAULT NULL, 
    `usernickname` varchar(80) DEFAULT NULL, 
    `userphoto` varchar(80) NOT NULL, 
    PRIMARY KEY (`userid`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

表话题

CREATE TABLE IF NOT EXISTS `topic` (
`topicid` int(11) NOT NULL AUTO_INCREMENT, 
`btid` int(11) NOT NULL, 
`topictitle` varchar(80) NOT NULL, 
`topiccontent` text NOT NULL, 
`topicisdel` int(11) NOT NULL, 
`topicdate` varchar(80) NOT NULL, 
`authorid` int(11) NOT NULL, 
`useraccesskey` varchar(80) NOT NULL DEFAULT '0', 
`topicistop` int(11) NOT NULL DEFAULT '0', 
`topicishot` int(11) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`topicid`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1605 ; 

我用这个SQL查询来列出所有相关信息

select b.*, (select userphoto from user u where u.useraccesskey = b.useraccesskey) as headpic, (select usernickname from user u where u.useraccesskey = b.useraccesskey) as nickname from topic b where b.topicisdel = 0 and b.btid = 3 order by b.topicistop desc, b.topicishot desc, b.topicid desc" 

但结果告诉我Subquery returns more than 1 row,但我检查了所有的相关信息,没有,我不知道为什么,请帮助我,谢谢。

+0

你的意思是说没有记录,但它说有更多的记录在那里? –

+0

@anantkumarsingh对不起,我的意思是有一些记录,但不一样,我不知道为什么,谢谢。 – pidan

+0

你究竟想要做什么以及结果如何,目前尚不清楚。 –

回答

0

所以它看起来像你的东西更多类似这样的后 - 尽管没有数据集和结果集,它总是愚蠢很难确定......

select b.* 
    , u.userphoto headpic 
    , u.usernickname nickname 
    from topic b 
    join user u 
    on u.useraccesskey = b.useraccesskey 
where b.topicisdel = 0 
    and b.btid = 3 
order 
    by b.topicistop desc 
    , b.topicishot desc 
    , b.topicid desc 
+0

非常感谢。 – pidan

0

SELECT列表中子查询返回的行数不止一个。 MySQL只能处理该上下文中的一个标量值,所以我们必须保证子查询不会返回两行或更多行。

避免错误的“快速修复”是在每个子查询上添加一个限制1,以便它返回最多一行。

我也推荐ORDER BY使结果更确定。我们没有看到user表中包含的其他列,因此我只是引用了由SELECT返回的列。

例如:

SELECT b.* 
    , (SELECT u.userphoto 
      FROM user u 
      WHERE u.useraccesskey = b.useraccesskey 
      ORDER BY 1 LIMIT 1    -- return at most one row 
     ) AS headpic 
    , (SELECT u.usernickname 
      FROM user u 
      WHERE u.useraccesskey = b.useraccesskey 
      ORDER BY 1 LIMIT 1    -- return at most one row 
     ) AS nickname 
    FROM topic b 
WHERE b.topicisdel = 0 
    AND b.btid = 3 
ORDER 
    BY b.topicistop DESC 
    , b.topicishot DESC 
    , b.topicid DESC 

我不认为这是“最好”的解决问题的办法。我试图解释是什么导致了这个问题,以及一种解决方法。

要看到那里的返回多行,我们可以添加其它子查询的SELECT列表...

 , (SELECT u.userphoto 
      FROM user u 
      WHERE u.useraccesskey = b.useraccesskey 
      ORDER BY 1 LIMIT 1,1    -- return value from 2nd row if it exists 
     ) AS headpic_2 

如果userphoto可以为NULL,可能没有给我们太多的指示,因为我们将无法区分来自行的NULL返回或由于行不存在而返回的NULL。

我们可以得到在SELECT列表中的其他子查询匹配的用户行数:

 , (SELECT COUNT(*) 
      FROM user u 
      WHERE u.useraccesskey = b.useraccesskey 
     ) AS count_matching_rows_in_user 

注意useraccesskey列不能保证是独一无二的user。如果没有这个保证,我们必须期待可能存在重复的值,也就是user中的多个行具有相同的值useraccesskey

相关问题