在postgresql …查询中加入两个单独的查询…(可能或不可能)
我在postgresql查询中返回第一个X记录并获得了一些很好的帮助, 该查询具有我遇到的问题并尝试尽可能地优化的独特字段 (尽管我通常不是很喜欢前加载优化,这是一种独特的情况)。
想象一下应用中的三个实体:
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个实例,其中:
- user_id不等于3
- post_id是独一无二的
- post_id没有其他实例,help_by_user_id为3
编辑:
我在http://sqlfiddle.com/#!10/7a324/1/0上为此创建了一个SQLFiddle。
为了记录,我使用Ruby 1.9.3,Rails 3.2.13和Postgresql(Heroku)
是的,所以你想要由$ user以外的人写的post,其中$ user的“实例”(似乎表示“回复”)出现。 从这个集合你想要选择十个不同的post。
如果这是一个准确的问题框架,这可以做你想要的:
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非常容易。
只是这样更容易阅读,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;