0

私は4つのテーブルを持っています

post
-------------
post_id
cat_id
posts

post_category
-------------
cat_id
cat_name

users
------------- 
user_id
user_name

user_category_map
-------------
user_id
cat_id

すべての投稿カテゴリのすべてのユーザーがすべての投稿を追加したい

私はこのクエリを書きました

 SELECT posts 
  FROM post p, users u, user_category_map ucm 
 WHERE p.cat_id = ucm.cat_id 
   AND ucm.user_id = u.user_id

しかし、私は繰り返し投稿されています。私のテーブル構造は正しく、正しく正規化されていますか?ロジックを正しく取得できません。私が入れた結合は正しいですか?

4

2 に答える 2

3

ここでは、すべてのテーブルの完全なデカルト積を受け取り、「p.cat_id=ucm。cat_idanducm.user_id=u.user_id」条件でフィルター処理します。このようなクエリは通常、最適化された結合バージョン(マージ、ネストされたループ、インデックス、またはハッシュ結合)に変換されます。

デカルト積A*B * Cの間、Aからのすべての行がB*C回繰り返されます。

「すべての投稿カテゴリのすべてのユーザーによって追加されたすべての投稿」というクエリは

select * from post
于 2012-08-09T11:00:55.483 に答える
2

デザインが正しくないようです。user_categoryの参照テーブルの代わりに、user_postの参照テーブルが必要です。現在のシナリオでは、同じユーザーが同じカテゴリに複数の投稿を追加すると、user_category_mapに重複する行が含まれることになります。

于 2012-08-09T11:03:31.963 に答える