2013-03-14 29 views
0

所以我有3個表:RecommendationArticleUser註解行,如果向後關係存在(Postgres的)

建議有4列:

id | integer 
article_id |integer 
user_id |integer 
submit_time |integer 

文章有3列:

id | integer 
title 
url 

我需要獲得所有物品的清單,同時還標註每行一個新的推薦欄,其如果有問題的用戶推薦了文章,則爲1,否則爲0。不應該有在結果的任何重複Article,我需要它下令在Recommendationsubmit_time列。

這是Postgres的 - 9.1.8。

SELECT DISTINCT ON(t.title) t.title, 
    t.id, t.url, 
    MAX(recommended) as recommended 
FROM ( 
    SELECT submitter_article.title as title, 
     submitter_article.id as id, 
     submitter_article.url as url, 
     1 as recommended 
    FROM submitter_article, submitter_recommendation 
    WHERE submitter_recommendation.user_id=? 
     AND submitter_recommendation.article_id=submitter_article.id 

    UNION ALL 

    SELECT submitter_article.title as title, 
     submitter_article.id as id, 
     submitter_article.url as url, 
     0 as recommended 
    FROM submitter_article 
    ) as t 

    GROUP BY t.title, t.id, t.url, recommended 

而且我傳遞一個user id?

我一直在想了一會兒做這個,但不能弄明白。我拿出無論是查詢返回所有recommended值0,或返回重複的物品列(一個recommended=0和其他與recommended=1)。

任何想法?

回答

1

你不需要子查詢,CASE會做,DISTINCT ON是無用的,如果你也使用GROUP BY,你應該使用顯式連接而不是隱式連接。這個查詢應該讓你開始:

SELECT DISTINCT ON (sa.title) sa.title, sa.id, sa.url, 
           (CASE 
            WHEN sr.id IS NULL THEN 0 
            ELSE 1 
           END) AS recommended 
FROM submitter_article AS sa 
LEFT JOIN submitter_recommendation AS sr ON sa.id=sr.article_id 
AND sr.user_id=? 
ORDER BY sa.title,sr.submit_time DESC; 

但仍有一些事情我不確定。您可以擁有兩個具有相同標題但不同ID的文章?在這種情況下,你可以選擇其中具有提前/推遲推薦SUBMIT_TIME但如果沒有建議?您需要邏輯來了解如何選擇不同的行以及如何最終排序。