我有四张桌子
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
但是我反复发帖。我的表结构是否正确并正确标准化。我无法正确抓住逻辑。我加入的联接是否正确?
答案 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中出现重复的行