2012-02-20 7 views
0

私は今プロジェクトに取り組んでおり、実行する特定のSQLクエリ(必要なもの)で困惑しています。私が引き出す必要のあるDB構造を見せてください。MySQLクエリ - ユーザIDとビジネスIDに基づいて

--posts_table-- 
    ID 
    post_title 
    post_text 
    bus_id 

次の表は、私と一緒にねじ込むものです。ログインしているユーザーに関連するデータは、特定の投稿を「好き」している場合のみ表示されます。そうでなければ、そのユーザーに関連するデータはこの表にはありません。他のユーザーから生成されたばかりの特定の投稿に関連するデータがたくさんある可能性があります。

--likes_table-- 
    ID 
    user_id 
    post_id 
    like 

私がこれを行うには、特定のビジネスIDが指定されているpost_tableのすべての投稿を取得する必要があります。そこから、ログインしたユーザーに関連するデータがある場合、likes_tableの「like」列を取得する必要があります。そこにデータがない場合は、そのフィールドをクエリにnullのままにしておきます。以下は、他のユーザーのlike_tableに他の "好きな"データがあるまで、私が書いたクエリです。

SELECT posts.id, posts.post_text, posts.post_title, likes.post_id, likes.like 
     FROM posts LEFT JOIN likes ON posts.id = likes.post_id WHERE 
     posts.bus_id = 1 AND likes.user_id IS NULL OR likes.user_id = 1; 

データは、そのユーザは、彼らがそれを好きか嫌いか、そのポストで何もしていた前に、別のユーザーに好かれている特定のポストについてのテーブルに入力されるまでこれがアップ動作します。私は、この特定のタイプのクエリーが可能であっても、どんな助けでも大いに感謝されるかどうかはわかりません。

編集:

再びそれを見た後 - 私は最終的に、それを得ました。私はちょうどもう1つを追加する必要があった。以下は、私が探していた適切なクエリです。それは、特定のポストは全くuser_id数1でのコメントされていない場合には、そのための行がまったく表示されないということである -

SELECT posts.id, posts.post_text, posts.post_title, likes.post_id, likes.like 
    FROM posts LEFT JOIN likes ON posts.id = likes.post_id AND posts.user_id = 1 WHERE 
    posts.bus_id = 1 AND likes.user_id IS NULL OR likes.user_id = 1; 
+0

あなたの質問が「うまくいかない」理由を理解するのに困っています。あなたの問題を再現する 'posts_table'と' likes_table'の小さなスニペットを与えることができますか?ですから、投稿1がbus_id 1を持っていてuser_id 1以外のユーザーが好きなら、あなたの質問は何を返すのですか?それは間違っていますか? –

+0

申し訳ありません - 説明するのは難しいです。他のユーザーからのその投稿に関連するlikesテーブルにデータがなかった場合にのみ、それは機能し、投稿データを返します。 – thefiddler

+1

私はあなたを得る - あなたがしたようにそれを考え出した。 'LEFT JOIN'に追加した後は、' WHERE'条件に 'likes.user_id IS NULL OR likes.user_id = 1'を追加する必要はありません。 (あなた自身の質問を解決しました。あなたの答えを回答として投稿し、それを受け入れることは自由です)。 –

答えて

0

ああ、私はあなたを取得だと思い

は、その場合には、これはuser_id 1が気に入っていない場合にNULLを置く--- WHERE条件の代わりに、結合条件にあなたのl.user_id=1を入れたり、特定のポストを嫌っ。

SELECT p.id, p.post_text, p.post_title, l.post_id, l.likes 
    FROM posts p 
    LEFT JOIN likes l ON p.id = l.post_id AND l.user_id=1 
    WHERE p.bus_id = 1 

l.user_id IS NULL OR l.user_id=1LEFT JOINに組み込まれている - それは、他のuser_id秒間の行を作成しません。

関連する問題