带连接的SQL查询

时间:2012-08-09 10:56:54

标签: mysql sql

我有四张桌子

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

但是我反复发帖。我的表结构是否正确并正确标准化。我无法正确抓住逻辑。我加入的联接是否正确?

2 个答案:

答案 0 :(得分:3)

在这里,您收到了所有表格的完整笛卡尔积,并按“p.cat_id = ucm.cat_id和ucm.user_id = u.user_id”条件对其进行过滤。 像这样的查询通常转换为优化的连接版本 - 合并,嵌套循环,索引或散列连接。

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

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

select * from post

答案 1 :(得分:2)

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