2012-08-09 193 views
0

我有四個表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

「user_id」到「post_id」映射的位置在哪裏? – 2012-08-09 11:02:13

+0

看起來你有很多用戶映射到一個類別,所以POST到USER是一對多的關係。 – valex 2012-08-09 12:27:34

回答

2

的設計看起來並不正確。而不是user_category的參考表,您應該有一個user_post參考表。在當前的情況下,如果同一用戶爲同一類別添加多個帖子,則最終會在user_category_map中重複行

+0

嗨Kamal,感謝您的回覆。所以你認爲應該爲帖子和用戶映射創建一個單獨的表格,或者只是在帖子表中添加用戶ID。什麼是更好的? – user965884 2012-08-10 02:50:42

+1

我不認爲你需要一個user_category_map。如果您創建了一個user_post_map,它將爲您提供user_id和post_id之間的關係。郵政表已經有類別信息(cat_id),所以沒有必要有一個單獨的表 – Kamal 2012-08-10 05:17:04

+0

你是對的卡邁勒。感謝您的指導。 – user965884 2012-08-10 08:43:48

3

在這裏,您收到了所有表格的完整笛卡爾積,並通過「p.cat_id = ucm。cat_id和ucm.user_id = u.user_id」條件對其進行過濾。 這樣的查詢通常轉換爲優化的連接版本 - 合併,嵌套循環,索引或散列連接。

在笛卡爾積A * B * C期間,A的每一行將重複B * C次。

您的查詢「所有用戶在所有職位類別添加的所有帖子」是

select * from post 
+0

但是根據表格設計,匿名用戶可以存在帖子,即沒有用戶表中的條目。在這種情況下,您的查詢可能會返回沒有用戶關係的帖子。 – sundar 2012-08-09 11:03:39

+0

正如我所能理解的源文章,需要所有用戶的所有帖子(匿名) – 2012-08-09 16:21:17

+0

所有文章都是select * from post ^^ - upvote – duffy356 2012-08-09 16:40:00