0

我有四张桌子

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_id 和 ucm.user_id = u.user_id”条件对其进行过滤。像这样的查询通常会转换为优化的连接版本——合并、嵌套循环、索引或哈希连接。

在笛卡尔积 A*B*C 期间,A 中的每一行都将重复 B*C 次。

您的查询“所有用户在所有帖子类别中添加的所有帖子”是

select * from post
于 2012-08-09T11:00:55.483 回答
2

设计看起来不正确。您应该有一个 user_post 的参考表,而不是 user_category 的参考表。在当前情况下,如果同一用户为同一类别添加多个帖子,您最终将在 user_category_map 中出现重复的行

于 2012-08-09T11:03:31.963 回答