2012-02-15 152 views
0

我有這些表:SQL SELECT查詢多個表

USERS: 
user_ID 
username 
password 
email 
data_registered 

POSTS: 
post_ID 
user_ID 
post_title 
post_content 
post_data 

CATEGORY: 
cat_ID 
post_ID 
cat_title 

現在我用這樣的狀況:

的用戶表,我有:

在帖子表格
(1, 'admin, '5hj63jhn120011', '[email protected]', '15.02.2012') 

(1, 1, 'Hello', 'Content goes here', '15.02.2012') 

CATEGORY表中:

(1, 1, 'web developing'), 
(2, 1, 'software programming'), 
(3, 1, 'web design') 

因此,我只有1個用戶,1個帖子和3個類別。如何在一個聲明中選擇它們?我用這個語句:

SELECT 
    p.post_title, 
    p.post_content, 
    u.username, 
    c.cat_title 
FROM 
    posts p 
    LEFT JOIN users u 
    ON p.user_ID = u.user_ID 
    LEFT JOIN category c 
    ON c.post_ID = p.post_ID 

但是這個選擇3行有3個不同的類別。我仍然在學習如何使這個JOIN查詢正確,所以我會很感激任何幫助。

然後,例如,我將有從COMMENTS表中選擇數據的情況,所以這將變得複雜。僅舉這是評語表:

COMMENTS: 
comment_ID 
user_ID 
post_ID 
c_username 
c_email 
c_content 

這會是艱難的選擇與用戶,職位和類別完全此評論。所以還有一個問題是我可以拆分這些選擇查詢,這是一個很好的實踐(用PHP開發時)嗎?

+3

你能提供你需要的樣本結果集嗎? – Vikram 2012-02-15 15:51:09

+0

它與你的問題無關你確定應該只有一個職位對應一個類別嗎? – 2012-02-15 16:01:26

+0

@C。香檳你的意思是一個後一類? – 2012-02-15 16:03:49

回答

0

嘗試:

SELECT p.post_title, 
     p.post_content, 
     u.username, 
     group_concat(c.cat_title) categories 
FROM posts p 
LEFT JOIN users u ON p.user_ID = u.user_ID 
LEFT JOIN category c ON c.post_ID = p.post_ID 
group by p.post_id 

- 如果你想看到所有的類別爲同一行中的一個職位。

+0

是的,布拉沃,這可能是最好的選擇 – 2012-02-15 15:59:09

0

使用類似的東西:

SELECT 
    p.post_title, 
    p.post_content, 
    u.username, 
    GROUP_CONCAT(c.cat_title + ',') cat_titles 
FROM posts p 
LEFT JOIN users u 
    ON p.user_ID = u.user_ID 
LEFT JOIN category c 
    ON c.post_ID = p.post_ID 
GROUP BY 
    p.post_title, 
    p.post_content, 
    u.username 

我不知道在GROUP_CONCAT的正確使用,但看起來像,如果將工作

0

我想應該是這樣的,而不是:

POSTS: 
post_ID 
user_ID 
cat_ID 
post_title 
post_content 
post_data 

CATEGORY: 
cat_ID 
cat_title 

由於類別不需要關聯的職位,但每個職位都需要一個類別來關聯。

更新:

如果多到很多是有意那麼就應該是這樣的:

POSTS: 
post_ID 
user_ID 
post_title 
post_content 
post_data 

CATEGORY: 
cat_ID 
cat_title 

POST_CATEGORY: 
post_ID 
cat_ID 
+0

這將是一種不同的關係 - 在原始問題中,同時屬於多個類別,但在這個答案中,一個帖子只能屬於一個類別。 – 2012-02-15 15:57:18

+1

所以一個帖子只能有一個類別。更好的設計可能是Posts,PostCategory,Category。 – 2012-02-15 15:57:44

+0

感謝提示,我仍然不擅長製作優秀的數據庫表,我知道基本的東西,所以在製作幾張表時,我不需要任何額外的複雜操作;) – 2012-02-15 16:01:29

0

沒有已經嘗試過了,我認爲解決的辦法是:

SELECT p.post_title, p.post_content, u.username, c.cat_title 
FROM users u LEFT JOIN posts p ON u.user_ID = p.user_ID 
LEFT JOIN category c ON p.post_ID = c.post_ID 

如果更改ID列的順序,則LEFT JOIN的含義會發生變化。所以你得到三個結果行....

+0

嗯給定的數據結果將是相同的。 – 2012-02-15 15:55:59