2017-12-08 28 views
0

私は2つのメインテーブル - postsusersを持っています。そして、ユーザの好きなポストを行として保存する3番目のテーブル。私は、ユーザーデータと結合された投稿、および現在のユーザーが好きな投稿(user_favs表の検索)を持っているかどうかを問い合わせる必要があります。インナーは2つのテーブルを結合し、第3のテーブルからカウントを結合します

は最終的に私は、クライアントに次のようなものを返したい:

{ 
    post_id: '...', 
    title: '...', 
    user_id: '...', 
    username: '...', 
    isFavourited: isFaved > 0 ? true : false 
} 

は1つの選択クエリを行うことが、このことは可能ですか?

CREATE TABLE posts (
    post_id uuid, 
    title  text 
    author_id uuid 
); 

CREATE TABLE users (
    user_id uuid, 
    username text 
); 

CREATE TABLE user_favs (
    user_id  uuid REFERENCES users ON DELETE CASCADE, 
    post_id uuid REFERENCES posts ON DELETE CASCADE 
); 

私のクエリは次のようになります。

SELECT 
    p.post_id, 
    p.title, 
    u.user_id, 
    u.username, 

    count(f.*) as isfaved 
FROM posts p 
JOIN users u 
ON p.author_id = u.user_id AND p.post_id = '1234' 
LEFT JOIN user_favs f 
ON f.user_id = p.author_id AND f.post_id = '1234' 

私も試してみた:

SELECT 
    p.post_id, 
    p.title, 
    u.user_id, 
    u.username, 
FROM posts p 
JOIN users u 
ON p.author_id = u.user_id AND p.post_id = '1234' 
LEFT JOIN 
    (SELECT count(*) FROM user_favs 
) f ON f.user_id = p.author_id AND f.post_id = '1234' 

編集:ちょうど私が達成するために望んでいるものを明確にする:私はフェッチてるのその投稿のそれぞれの著者を返信し、さらに、その投稿が要求しているユーザによって優先されているかどうかをチェックする。

+0

あなたは 'つまり、あなたの例では多くのエラーを(持っていますpost_id uuid REFERENCES users')。読むのは難しいです。 –

+0

ユーザーが自分の投稿をお気に入りにしているかどうか、またはユーザーが*任意の*ユーザーによって投稿をお気に入りにしているかどうかを確認しようとしていますか? –

+0

後者です。したがって、投稿を取得し、その投稿のそれぞれの著者を返信して、その投稿が要求しているユーザによって優先されているかどうかを確認します。私は明確にするために質問を更新します。 –

答えて

0

おそらく、私はそれをテストすることができますので、私は、テーブルを変更し

SELECT 
    p.post_id, 
    p.title, 
    u.user_id, 
    u.username, 
(SELECT count(*) FROM user_favs f where f.user_id = p.author_id AND f.post_id = p.post_id) 
FROM posts p 
JOIN users u 
ON p.author_id = u.user_id AND p.post_id = '1234' 
0

に似て、あなたのSELECT句にまでSELECT COUNT(*)を持ち込む方がいいでしょう。あなたが与えた情報を使用して:、特定のポストのためのポスト情報、著者を選択し、現在のユーザー(私は推測ログインしているユーザー)がリツイートか ポストこと:

drop table if exists user_favs cascade; 
drop table if exists posts cascade; 
drop table if exists users cascade; 

CREATE TABLE users (
    user_id int primary key, 
    username text 
); 

CREATE TABLE posts (
    post_id int primary key, 
    title  text, 
    user_id int references users 
); 


CREATE TABLE user_favs (
    user_id  int REFERENCES users ON DELETE CASCADE, 
    post_id int REFERENCES posts ON DELETE CASCADE 
); 


SELECT 
    p.post_id, 
    p.title, 
    u.user_id, 
    u.username, 

    case when f.user_id is not null then true else false end as isfaved 
FROM posts p 
JOIN users u ON p.user_id = u.user_id 
LEFT JOIN user_favs f on f.post_id = p.post_id 
where p.post_id=1234 -- the post you want to select 
and f.user_id = 4321; -- the id of the current user 
関連する問題