“子查询返回超过1行”错误。

时间:2011-10-05 08:36:31

标签: sql subquery

我是网络编程的新手,我正在努力制作推特克隆。此时,我有3个表:

  

用户(身份证,姓名)

  • id是自动生成的ID
  • 用户名称
  

推文(id,content,user_id)

  • id是自动生成的ID
  • 内容是推文的文字
  • user_id是发布帖子的用户的ID
  

粉丝(id,user_id,following_id)

  • id是自动生成的ID
  • user_id是执行以下操作的用户
  • following_id是正在关注的用户

所以,作为sql的新手,我正在尝试构建一个SQL语句,它将返回当前登录用户和他所关注的每个人的推文。

我试图使用这个语句,它有时会起作用,但有时候,我会收到一条错误,上面写着“子查询返回超过1行”。以下是声明:

SELECT * FROM tweets 
WHERE user_id IN
((SELECT following_id FROM followers
WHERE user_id = 1),1) ORDER BY date DESC
  • 我在这里以1为例,这将是当前登录用户的id。

我对这句话没有任何好运;任何帮助将不胜感激!谢谢。

3 个答案:

答案 0 :(得分:6)

在一条评论中,您会问is it generally better to use a subquery or a union。不幸的是,没有简单的答案,只有一些信息。


如果lsit很大,某些种类的SQL在优化IN子句时会遇到问题,并且可能会在以下任何一种方式下表现更好......

SELECT * FROM tweets
INNER JOIN followers ON tweets.user_id = followers.following_id
WHERE followers.user_id = 1

UNION ALL

SELECT * FROM tweets
WHERE user_id = 1

或者...

SELECT
  *
FROM
  tweets
INNER JOIN
  (SELECT following_id FROM followers WHERE user_id = 1 UNION SELECT 1) AS followers
    ON tweets.user_id = followers.following_id

或者...

SELECT
  *
FROM
  tweets
WHERE
  EXISTS (SELECT * FROM followers WHERE following_id = tweets.user_id and user_id = 1)
  OR user_id = 1

有很多很多替代品......


某些类型的SQL难以优化OR条件,最终检查tweets表中的每条记录而不是使用INDEX。这将使UNION选项更受欢迎,因为查询的每一半都将受益于user_id字段上的索引。

但是你实际上可以完全从你的代码中重构这个角落:让每个用户都成为他们自己的追随者。这意味着获取关注者的推文自然会包括用户自己。这在所有情况下是否有意义取决于您的设计和其他功能要求。


简而言之,您最好的选择是创建一些有代表性的数据并测试选项。但我现在不会真的担心它。只要您将此代码封装在一个位置,您就可以选择一个您最熟悉的代码。然后,当您将系统的其余部分删除,并且您对事情不会发生变化更加自信时,您可以返回并在必要时优化

答案 1 :(得分:4)

SELECT * 
FROM tweets 
WHERE 
  user_id IN (SELECT following_id FROM followers WHERE user_id = 1)
  OR user_id = 1
ORDER BY date DESC

答案 2 :(得分:2)

试试这个

SELECT * FROM tweets WHERE user_id = [YourUser]
UNION
SELECT * FROM tweets WHERE user_id in (SELECT following_id FROM followers WHERE user_id ? [YourUser]
即使您的用户没有粉丝,

仍然有效

还有一个加入的解决方案,但实际上我很着急。我会尽快尝试编写查询。其他人可能会在那时回答。遗憾。