2016-04-14 3 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 

Я хотел бы выберите рекомендацию_текст, user_id и последнее рейтинговое значение из таблицы рейтинга для каждой строки i n таблица рекомендаций.

У меня возникли проблемы только возвращающегося последнее значение рейтинга:

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

Я думаю, что здесь отсутствует какая-то информация, я не уверен, как вы выбираете, какой рейтинг следует приложить к какой рекомендации. В вашем примере запроса вы присоединяетесь только к идентификатору пользователя, но если бы это был единственный ключ, о котором вы заботились, было бы не более одной рекомендации для каждого пользователя. Является ли идентификатор внешним ключом из одной таблицы в другую? – Kateract

+0

Какая СУБД вы используете? –

+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

обновления на основе комментариев:

FYI, этот запрос будет работать только если идентификаторы в вашей рейтинговой таблице находятся в том же порядке, как и даты в рейтинговой таблице. Если вы в конечном итоге с записью с более высоким 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, нижняя часть содержит проверку даты, а затем для каждой рекомендации находит соответствующий идентификатор последней оценки (используя группу max (rating.id) rec.id'), которая затем используется как JOIN, чтобы найти точный текст рекомендации. – DhruvJoshi

+0

@DerekA. FYI, этот запрос будет работать только в том случае, если идентификатор в вашей таблице рейтинга находится в том же порядке, что и даты в таблице рейтинга. Если вы закончите с записью с более высоким идентификатором, но с более ранней датой, тогда он вернет более высокий идентификатор вместо более поздней даты. – 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 
Смежные вопросы