2017-01-10 19 views
0

私は2つのテーブルがあります。これは、SQL文が正常に一人のユーザに最後のメッセージを取得しネストされたクエリ、サブクエリSQL

select * from friends; 
user_id | friend_id |   created_at   
---------+-----------+---------------------------- 
user | user2  | 2017-01-09 21:29:56.31972 
user | user3  | 2017-01-09 21:29:58.567925 
user | user4  | 2017-01-09 21:30:01.200806 
user2 | user  | 2017-01-09 21:30:49.498912 
user3 | user  | 2017-01-09 21:30:53.549042 
user4 | user  | 2017-01-09 21:30:56.519135 
id | user_id | user_from | message 
----+---------+-----------+--------- 
    1 | user | user2  | hey 
    2 | user | user3  | de 
    3 | user | user4  | bal 
    4 | user | user3  | ok 
    5 | user | user3  | nice 
    6 | user | user4  | cana 
    7 | user | user2  | doc 

を。例えば。

select id, user_from, message 
from messages 
WHERE user_id = 'user' 
AND user_from = 'user3' 
ORDER BY id DESC 
limit 1; 
id | user_from | message 
----+---------+--------- 
    5 | user3 | nice 

ユーザー

にユーザー3によって送信された最後のメッセージは、私は、メッセージのコレクションを取得する必要があります。各メッセージは、ユーザーに友人から送られた最後のメッセージを表し

私はこの

id | user_from | message 
----+-----------+--------- 
    7 | user2  | doc 
    5 | user3  | nice 
    6 | user4  | cana 

答えて

0

distinct onが必要なものを取得するには、W3Schoolsのかtutorialspointに参加し、ルックアップについての記事を読むまで);しかし、より良い正規化されたデシベルで作業する、参加する使用を検討ここで最も簡単な解決方法です。

これはSQL標準にpostresql拡張子を使用して、そこにこの使用してウィンドウの機能を行うための標準的な方法もありますが、それはより複雑だし、自己結合を使用して、潜在的に非効率的な方法。

+0

これは動作しませんでした:ERRORを: 表現BY LINE 1初期ORDERと一致する必要があります式にDISTINCT SELECT:(user_from)ID、user_from ON DISTINCTを選択し、メッセージ – user1000622

+0

を、私は次のようにクエリを変更...選択DISTINCT ON(user_from)id、user_from、メッセージ メッセージfrom user_id = 'user' AND user_from = 'user3' ORDER BY user_from、id DESC; id: user_from |メッセージ ---- + ----------- + --------- 5 |ユーザー3 | nice – user1000622

+0

しかし、私は欲しいものを達成できません。 1行だけを取得します – user1000622

-1

スタートのような何かを得るように、データベース、リレーショナルデータベースを正規化することにより、クエリを組み合わせることである必要なものこれが必要です。

あなたがdb designとsqlにどれほど親しみを感じているかわかりません。

がここに正規また http://www.studytonight.com/dbms/database-normalization.php

youllはあなたが

0

ジョインとウィンドウ機能を使用できます(ケースはrow_number)。

最初のテーブルがfriendsであり、2番目のテーブルがmessagesであると仮定すると、この解決策は動作する可能性があります(未テストです)。

select id, user_from, message 
from (
    select m.* 
    , row_number() over(partition by m.user_from order by f.created_at desc) as N 
    from friends f, messages m 
    where f.user_id = m.user_id and f.friend_id = m.user_from) x 
where N = 1;