在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个实例,其中:

  1. user_id不等于3
  2. post_id是独一无二的
  3. 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;