2016-04-14 75 views
1

我有以下两个表(填充更多的数据):SQL加入排序和限制结果

评级

ID | user_id | rating_value | date 
1 1   0.6   2016-04-02 
2 2   0.75   2016-04-05 
3 1   0.4   2016-04-08 
4 2   0.5   2016-04-12 

推荐

ID | user_id | recommendation_text | date 
1 1   'a'     2016-04-03 
2 2   'b'     2016-04-07 
3 1   'c'     2016-04-09 

我想从每个行i的评级表中选择recommendation_text,user_id和最新评级值在推荐表中。

我无法只返回了最新的评价值(预期)

SELECT rec.user_id, rec.recommendation_text, rec.recommendation.date, rating.rating_value, rating.date 
FROM recommendation AS rec 
JOIN rating 
ON rec.user_id = rating.user_id; 

返回所有值加入到建议。最终的结果,我想产生是:

user_id | recommendation_text | recommendation_date | rating_value | rating_date 
1   'a'     2016-04-03   0.6   2016-04-02 
2   'b'     2016-04-07   0.75   2016-04-05 
1   'c'     2016-04-09   0.4   2016-04-08 
+0

我认为这里有一条信息缺失,我不知道如何选择哪个评级来附加到哪个建议。在您的示例查询中,您只能加入用户ID,但如果这是您关心的唯一密钥,那么每个用户不会有超过一个建议。 ID是从一个表到另一个表的外键? – Kateract

+0

你正在使用哪些DBMS? –

+0

使用PostgreSQL –

回答

1

你可以试试下面的查询将在工作的PostgreSQL,MySQL和SQL数据库

SELECT rec.user_id, rec.recommendation_text, rec.date, rating.rating_value, rating.date 
FROM recommendation AS rec 
JOIN rating ON rec.user_id = rating.user_id 
JOIN 
(SELECT rec.id as id1, max(rating.id) as id2 
FROM recommendation AS rec 
JOIN rating 
ON rec.user_id = rating.user_id AND rec.date >rating.date 
GROUP BY rec.id) t 
on t.id1= rec.id and t.id2=rating.id; 

Demo link here

更新基于评论:

仅供参考,该查询只会如果ID在你的等级表是在同一顺序的等级表的日期工作。如果你结束了一个更高的ID的记录,但更早的日期,那么它将返回上级ID,而不是以后的日子

SELECT rec.user_id, rec.recommendation_text, rec.date, rating.rating_value, rating.date 
    FROM recommendation AS rec 
    JOIN rating ON rec.user_id = rating.user_id 
    JOIN 
    (SELECT rec.id as id1, max(rating.date) as id2 
    FROM recommendation AS rec 
    JOIN rating 
    ON rec.user_id = rating.user_id AND rec.date >rating.date 
    GROUP BY rec.id) t 
    on t.id1= rec.id and t.id2=rating.date; 

updated Demo link

+0

这工作就像一个魅力,谢谢!我仍对下半部分的实际操作有些困惑,但我会自己调试。 –

+0

说明:上面的部分为JOIN生成多个结果,bottom部分包含日期检查,然后为每个推荐查找相应的最后评级的id(使用由rec.id'设置的max(rating.id)组),然后使用它作为JOIN找到确切的建议文本。 – DhruvJoshi

+0

@DerekA。仅供参考,只有当您的评级表中的ID与评级表中的日期顺序相同时,该查询才会有效。如果您最终得到的ID较高但日期较早的记录,则会返回较高的ID而不是较晚的日期。 – Kateract

0

你可以尝试这样的:

SELECT rec.user_id, rec.recommendation_text, rec.recommendation.date, rating.rating_value, rating.date 
FROM recommendation AS rec 
JOIN rating 
ON rec.user_id = rating.user_id 
where recommendation.date = 
(Select top 1 rec_order.date from recommendation AS rec_order where recorder.user_id=rating.user_id); 
0

另一种方法,无需再选择:

select rec.user_id, rec.recommendation_text, rec.dates, rat.rating_value, rat.dates 
from recommendation as rec 
left join rating as rat on rat.user_id = rec.user_id and rat.dates < rec.dates 
left join rating as rat1 
on rat.user_id = rat1.user_id and rat.dates < rat1.dates and rat1.dates < rec.dates 
where rat1.id is null