私は3つのテーブルを持っています。1つはユーザー用、もう1つは投稿用、そして他の2つのテーブルをリンクする結合テーブルです。
結合テーブルのサンプルデータを次に示します。
| 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は4-17-2012ではないためです。user_id= 2の場合、両方の投稿が選択されます。user_idのエントリがないため、投稿1が選択されます。 =2およびpost_id=1、およびpost 2(4-17-2012)user_id = 3の場合、post 1は返されませんが、post2は、user_id=3およびpost_id=2のエントリがないため返されます。
これが私が試したことの例です:
SELECT*FROM投稿ASpLEFT JOIN posts_users as pu ON(p.post_id = pu.post_id)WHERE((pu.user_id = $ user_id AND pu.timestamp = 4-17-2012)OR(pu.post_id IS NULL)
投稿にpost_id=3行がある場合、LEFT JOINが#2を満たすのに役立つため、すべてのposts_users列でNULLになります。ただし、post_id = 3のposts_usersエントリを持つ人がいる場合、NULLはありません。MySQLに#2のロジックを含める方法はありますか?
私はこれをすべてPHPで既に記述されているフレームワークで行っており、返される結果をフィルタリングするためにPHPを使用する必要が非常に困難になる方法で行っています。その1つで私を信じてください。これを実現するためにSQLステートメントを使用する方法はありますか、または他のクエリの結果を取得した後、PHPで回避策を実行する必要がありますか?
ありがとう。