SELECT f.* FROM feeds f, user_feeds uf WHERE (f.id=uf.feed_id and uf.user_id in (1,2,5,6,23,45)) ORDER BY created_at DESC
这是用于构建用户供稿的查询。我对此查询的问题是“uf.user_id in()”随着他跟随的用户数量的增加而增加。
SQL查询允许的最大长度是多少? 有没有更好的方法来实现我的上述查询?
注意:我使用的是ActiveRecord。我正在使用Postgres。
答案 0 :(得分:15)
PostgreSQL可以处理的查询的最大长度是2147483648个字符(带符号的4字节整数;请参阅src/include/lib/stringinfo.h
)。
答案 1 :(得分:4)
为了避免查询大小,你可以用IN替换IN(1,2)(从follower_id =?中选择follow_id)或者从跟随者的id中找到被跟踪用户的ID的任何相应查询。
答案 2 :(得分:1)
您可以考虑使用子查询来构造原始WHERE子句的IN部分。所以结果看起来像这样:
“SELECT f。* FROM feeds f,user_feeds uf WHERE(f.id = uf.feed_id和uf.user_id in(SELECT跟随whereer = id))ORDER BY created_at DESC”
显然子查询不正确,因为我发布了它,但这应该给你一般的想法。
答案 3 :(得分:1)
虽然查询字符串的长度没有(实际)限制,但IN(x,y,z ...)子句的数量有限制:10000,可在postgres.ini文件中配置:
“在7.4及更早版本中,它取决于max_expr_depth设置。” ... “在8.0及更高版本中,max_expr_depth消失了,限制依赖于 max_stack_depth“。
答案 4 :(得分:0)
使用相关的子查询。如果您有一个用于保存用户的表,则跟随您的查询文本将不会增长。
例如:
SELECT f.*
FROM feeds f,
user_feeds uf
WHERE f.id=uf.feed_id
AND EXISTS (SELECT 'X'
FROM follows
WHERE follows.user_id = uf.user_id)
ORDER BY created_at DESC;