我是网络编程的新手,我正在尝试制作推特克隆版.此时,我有3个表:
用户(id,name)
推文(id,content,user_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)
我对这个说法没有任何好运; 任何帮助将不胜感激!谢谢.
在一条评论中你问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字段上的索引.
但是你实际上可以完全从你的代码中重构这个角落:让每个用户都成为他们自己的追随者.这意味着获取关注者的推文自然会包括用户自己.这在所有情况下是否有意义取决于您的设计和其他功能要求.
简而言之,您最好的选择是创建一些有代表性的数据并测试选项.但我现在不会真的担心它.只要您将此代码封装在一个位置,您就可以选择一个您最熟悉的代码.然后,当您将系统的其余部分挖空,并且您对事情不会发生变化更加自信时,您可以在必要时返回并进行优化.
| 归档时间: |
|
| 查看次数: |
18403 次 |
| 最近记录: |