在postgresql ...查询中加入两个单独的查询...(可能或不可能)

时间:2014-02-21 05:06:57

标签: sql ruby-on-rails ruby arrays postgresql

我在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个实例:

  1. user_id不等于3
  2. post_id是唯一的
  3. 没有其他的post_id实例和help_by_user_id为3

  4. 修改

    我在http://sqlfiddle.com/#!10/7a324/1/0创建了一个SQLFiddle。

    为了记录,我使用的是Ruby 1.9.3,Rails 3.2.13和Postgresql(Heroku)

2 个答案:

答案 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;