2012-04-17 16 views
0

私は3つのテーブルを持っています。ユーザー用に1つ、投稿用に1つ、および他の2つのテーブルをリンクする結合テーブル。MySQL JOIN - 複雑なSelectステートメント

ここに、結合テーブルのサンプルデータがあります。

| id | user_id | post_id | timestamp | 
|----|---------|---------|-----------| 
| 1 | 1 | 1 | 4-17-2012 | 
| 2 | 1 | 2 | 4-16-2012 | 
| 4 | 2 | 2 | 4-17-2012 | 
| 5 | 3 | 1 | 4-16-2012 | 
|____|_________|_________|___________| 

は私が行いますSELECTクエリを書きたい次

1)2012年4月17日

のタイムスタンプを持つユーザーのすべての投稿を選択します

2)そのユーザーの結合テーブルに投稿エントリがない場合は、それらの投稿も選択します。

だから... ...のuser_id = 1の場合 、1が選択されるが、2を投稿していない、ポスト2のuser_id = 2については2012年4月17日 ではないので、両方の記事が選択されることになるポスト、ポスト1理由user_id = 2、post_id = 1、投稿2は4-17-2012です user_id = 3の場合、post 1は返されませんが、post 2はuser_idのエントリがないためですPU ON(p.post_id = pu.post_id)としてposts_usersを登録しよう

SELECT *をP LEFT AS投稿者:= = 2

3とpost_idのは、ここで私がしようとしてきたものの一例ですWHERE(pu.user_id = $ user_id AND pu.timestamp = 4-17-2012)OR(pu.post_id IS NULL)

投稿にpost_id = 3行がある場合、NULLになりますすべてのposts_users列はLEFT JOINのため、#2を満たすのに役立ちます。しかしpost_id = 3のposts_usersエントリを持つ人がいれば、NULLはありません。 MySQLに#2のロジックを持たせる方法はありますか?

私はすでにPHPで書かれたフレームワークでこれをすべてやっています。返された結果をフィルタリングするためにPHPを使用する必要があります。私にそのことを信じてください。これを達成するためにSQL文を使用する方法がありますか、または他のクエリの結果を得た後にPHPで回避策を講じなければなりませんか?

ありがとうございました。

+0

探しにuser.id = posts_users.user_id左外部結合のポストにposts_usersを外部結合左ユーザから選択します*これにさらに、それは私が存在しない使用することができるように見える?私は以前これを使用したことはありません。私はこのコンテキストでどのように使用しますか?再度、感謝します。 – MattDiamant

答えて

1

これは機能しますか?

はposts.id = posts_users.post_idどこのタイムスタンプ=「2012年4月17日」やタイムスタンプ= NULL

+0

その正確なステートメントは機能しません(たとえば、user_idはありません)が、答えにつながるので、チェックマークを付けます。私が使ったステートメントは(基本的に)以下のものです(これらは実際にテーブルやカラムの名前ではありません)。それはひどいです。神が私の魂に慈悲を持ってください。 '投稿を選択します*ユーザから(1) LEFT JOIN posts_users ON((posts.id = posts_users.post_id)AND(users.id = posts_users.user_id)) WHERE(users.id = $ user_id)AND((posts_users.timestamp = '4-17-2012')OR(posts_users.timestamp IS NULL)) ' – MattDiamant

関連する問題