2014-02-21 101 views
2

我在Returning the first X records in a postgresql query with a unique field上得到了一些很大的幫助,我遇到了一個問題,並試圖儘可能地優化(雖然我通常不是前端加載優化的忠實粉絲,但這是一種獨特的情況)。在postgresql ...查詢中加入兩個單獨的查詢...(可能或不可能)

在應用試想三個實體:

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和

    編輯的3

的helped_by_user_id:

我創建這是一個SQLFiddle在http://sqlfiddle.com/#!10/7a324/1/0

爲了記錄在案,我使用Ruby 1.9.3,Rails的3.2.13和PostgreSQL(Heroku的)

+1

的解釋是一點點混亂。任何機會,你可以把一些實際的樣本數據,並顯示預期的結果? http://sqlfiddle.com/很有用。 –

+0

克雷格,你說得很對......這是一個難以解釋的問題,所以我把一個小平臺放在一起,以便更好地解釋它。我將它附加到我原來的帖子中。 –

+0

忘記保存編輯?我沒看到它。 –

回答

0

只是所以它更容易閱讀,與信貸將@CraigRinger,這對我來說真是棒極了最終解決方案進行100%:

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; 
2

好,那你想超過$用戶等人撰寫的文章,其中沒有 「實例」(似乎是「答覆」)爲$用戶出現。從這一套你希望選擇十個不同的職位。

如果是這樣的問題的一個精確的取景,這你想要做什麼:

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非常容易。

+0

這有助於TON。好像什麼結束了對我來說完美的工作是:'SELECT DISTINCT ON(POST_ID)* FROM 我實例WHERE i.user_id <> 3 和i.helped_by_user_id IS NULL 和NOT EXISTS( 選擇1 從實例中二 WHERE ii.post_id = i.post_id AND ii.helped_by_user_id = 3 ) ORDER BY i.post_id LIMIT 10;'返回10個實例具有獨特POST_ID的,它也檢查以確保一個實例與該POST_ID和用戶設置爲「幫助_用戶_標識」不存在。我在制定這個問題方面遇到了很多麻煩,所以感謝你的支持。 –

+0

我已更新我的問題以更好地解釋它,我給了太多無益的信息。 –