0

次の機能を作成するための最も効率的な方法を探しています。ユーザーはページをロードします。これにより、(user_postテーブルから)ランダムな投稿が提供されますが、以前に表示した投稿は除外する必要があります。私のデータ構造は(簡略化されています):

user_post
---------
id (PK)


user_post_view
--------------
id (PK)
user_id
user_post_id

ここで、user_postは保存された投稿であり、user_post_viewは、ユーザーをユーザーが表示した投稿に関連付けます。したがって、英語でのクエリは次のようになります。

user_post_viewレコードがないuser_postテーブルからランダムな投稿を選択します

私はYiiフレームワークを使用していますが、「通常の」SQLステートメントでも役立ちます。

4

2 に答える 2

1
SELECT * FROM user_post p where 
your_user_id NOT IN (SELECT user_id FROM user_post_view WHERE user_post_id = p.id)

編集:

EXISTSは、実際にはおそらくここでより理にかなっています...そして、あなたが1つの投稿が必要な場合に備えて、私はあなたのLIMIT1に取り組みました

SELECT * FROM user_post p where 
NOT EXISTS (SELECT user_id FROM user_post_view WHERE user_post_id = p.id AND 
user_id = your_user_id) LIMIT 1
于 2012-11-17T23:56:17.167 に答える
1
SELECT p.* FROM user_post p LEFT JOIN user_post_view pv ON (pv.user_id = your_user_id_here AND pv.user_post_id = p.id) WHERE pv.user_id = NULL

トリックを行う必要があります。user_post_viewテーブルを使用してLEFTJOINを試みます。これが失敗した場合、結合の右側からのすべてのフィールドがnullになります。私はこれを利用しています。

効率を上げるために、user_id、user_post_idにインデックスを付けるインデックスがあることを確認してください。プライマリである必要はありません。リクエストを高速化するための何らかのインデックスです。

于 2012-11-17T23:51:24.480 に答える