"子查询返回超过1行"错误.

kur*_*kun 2 sql subquery

我是网络编程的新手,我正在尝试制作推特克隆版.此时,我有3个表:

用户(id,name)

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

推文(id,content,user_id)

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

粉丝(id,user_id,following_id)

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

因此,对于sql也是新手,我正在尝试构建一个SQL语句,它将返回当前登录用户和他所关注的每个人的推文.

我试图使用这个有时有效的语句,但有时候,我得到一个错误,上面写着"Subquery返回多行".这是声明:

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

我对这个说法没有任何好运; 任何帮助将不胜感激!谢谢.

Mat*_*lie 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
Run Code Online (Sandbox Code Playgroud)

要么...

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
Run Code Online (Sandbox Code Playgroud)

要么...

SELECT
  *
FROM
  tweets
WHERE
  EXISTS (SELECT * FROM followers WHERE following_id = tweets.user_id and user_id = 1)
  OR user_id = 1
Run Code Online (Sandbox Code Playgroud)

有很多很多选择......


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

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


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