我是网络编程的新手,我正在努力制作推特克隆。此时,我有3个表:
用户(身份证,姓名)
推文(id,content,user_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
我对这句话没有任何好运;任何帮助将不胜感激!谢谢。
答案 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]
即使您的用户没有粉丝,仍然有效
还有一个加入的解决方案,但实际上我很着急。我会尽快尝试编写查询。其他人可能会在那时回答。遗憾。