我在Returning the first X records in a postgresql query with a unique field得到了一些很好的帮助,我遇到了一个问题,并且尽可能地尝试优化(尽管我通常不是前端加载优化的忠实粉丝) ,这是一种独特的情况。)
想象一下应用中的三个实体:
User
Post
Instance # An instance is just a reference to a post
字段看起来像这样:
User
id
Post
id
user_id
name
Instance
id
user_id
post_id
helped_by_user_id
要求:
返回10个实例:
修改
我在http://sqlfiddle.com/#!10/7a324/1/0创建了一个SQLFiddle。
为了记录,我使用的是Ruby 1.9.3,Rails 3.2.13和Postgresql(Heroku)
答案 0 :(得分:3)
是的,所以你想要由$ user以外的人写的帖子,其中$ user的“实例”(似乎表示“回复”)出现。从这个集合中,您希望选择十个不同的帖子。
如果这是一个准确的问题框架,这可以做你想要的:
SELECT *
FROM posts p
WHERE p.user_id <> 3
AND NOT EXISTS (
SELECT 1
FROM instances i
WHERE i.post_id = p.id
AND i.helped_by_user_id = 3
)
ORDER BY p.id
LIMIT 10;
总的来说,感觉这里的问题是问题并没有真正明确。通常情况下,如果您可以用清晰的英语说出您想要的数据集,那么将其转换为有用的SQL非常容易。
答案 1 :(得分:0)
这样更容易阅读,100%的功劳归功于@CraigRinger,对我来说最有效的最终解决方案是:
SELECT DISTINCT ON (post_id) *
FROM instances i
WHERE i.user_id <> 3
AND i.helped_by_user_id IS NULL
AND NOT EXISTS (
SELECT 1
FROM instances ii
WHERE ii.post_id = i.post_id
AND ii.helped_by_user_id = 3
)
ORDER BY i.post_id
LIMIT 10;