2014-01-06 100 views
1

我在數據庫中的以下表:MySQL的左連接查詢 - 讓數據從三個表

post

+---------------+----------------+------+-----+---------+----------------+ 
| Field   | Type   | Null | Key | Default | Extra   | 
+---------------+----------------+------+-----+---------+----------------+ 
| post_id  | int(11)  | NO | PRI | NULL | auto_increment | 
| post_content | varchar(50000) | NO |  | NULL |    | 
| post_date  | datetime  | NO |  | NULL |    | 
| post_summary | varchar(1000) | YES |  | NULL |    | 
| post_title | varchar(300) | NO |  | NULL |    | 
| post_visitors | int(11)  | NO |  | NULL |    | 
| user_id  | int(11)  | NO | MUL | NULL |    | 
| category_id | int(11)  | NO | MUL | NULL |    | 
+---------------+----------------+------+-----+---------+----------------+ 

user

+---------------+--------------+------+-----+---------+----------------+ 
| Field   | Type   | Null | Key | Default | Extra   | 
+---------------+--------------+------+-----+---------+----------------+ 
| user_id  | int(11)  | NO | PRI | NULL | auto_increment | 
| user_image | varchar(500) | YES |  | NULL |    | 
| user_name  | varchar(45) | NO |  | NULL |    | 
| user_password | varchar(45) | NO |  | NULL |    | 
| user_type  | varchar(30) | NO |  | NULL |    | 
| user_username | varchar(45) | NO |  | NULL |    | 
+---------------+--------------+------+-----+---------+----------------+ 

comment

+-----------------+--------------+------+-----+---------+----------------+ 
| Field   | Type   | Null | Key | Default | Extra   | 
+-----------------+--------------+------+-----+---------+----------------+ 
| comment_id  | int(11)  | NO | PRI | NULL | auto_increment | 
| comment_content | varchar(600) | NO |  | NULL |    | 
| comment_date | datetime  | NO |  | NULL |    | 
| comment_title | varchar(300) | NO |  | NULL |    | 
| user_id   | int(11)  | NO | MUL | NULL |    | 
| post_id   | int(11)  | NO | MUL | NULL |    | 
+-----------------+--------------+------+-----+---------+----------------+ 

我需要一個查詢,將返回post_title,post_summary,post_date,number_of_comments_for_this_post,user_name,訂購number_of_comments_for_this_post(降序)。

基本上我需要所有三個表中的數據。我知道如何將兩個表連接起來並獲取一些數據。例如:

SELECT p.post_title, p.post_summary, p.post_date, u.user_name 
FROM post p LEFT JOIN user u ON p.user_id=u.user_id; 

如何通過加入第三個表(評論),並添加更多的領域擴展此查詢 - 「帖子的數量意見」下令最先評論的帖子(DESC)?

回答

2

加入只是一個relational algebra運營商。關係代數只是另一種查詢形式主義。表格是一種關係,對它們的操作會產生其他關係。您可以使用多個操作來生成結果關係。 MySQL JOIN手冊頁也提供了它。

要計算一組行的某些統計量,您需要aggregate functions。在這種情況下,您需要COUNT

SELECT 
    post_title, 
    post_summary, 
    post_date, 
    COUNT(comment_id) AS comment_cnt, 
    user.user_name 
FROM 
    post 
    LEFT JOIN user USING(user_id) 
    LEFT JOIN comment USING(post_id) 
GROUP BY 
    post_id 
ORDER BY 
    comment_cnt DESC 
-1

非常容易,只要用正常的語法

select p.post_title, p.post_summary, p.post_date, u.user_name 
from post p 
left join user u 
on p.user_id = u.user_id 
left join comment c 
on p.post_id = c.post_id 

繼續另外一個有用的小幫手:

如果您有兩個表加入列具有相同的名稱使用使用情況() 讓你的mysql jedi生活更輕鬆!

select p.post_title, p.post_summary, p.post_date, u.user_name 
from post p 
left join user u 
USING(user_id) 
left join comment c 
USING(post_id) 
+0

Padawan,不要使用USING()。在較大的查詢中,它變得太混亂。並沒有性能優勢。 – Strawberry

+0

當然這不是性能上的好處,但它也不是缺點。而其代碼越少,我就會通過閱讀用戶u等表格詞綴,然後u.x = c.y而感到頭痛。我不認爲這是令人困惑的,但這是一個品味問題!大型查詢無論如何都難以閱讀,不管USING()或ON語句如何。使用新行格式化您的查詢將使其可讀性達到一半... – Steini

+0

@Steini您沒有在結果中包含「number_of_posts」註釋字段,並且按字段排序 – Vladimir

1

像這樣的事情

SELECT 
    p.post_id, 
    p.post_date, 
    p.post_summary, 
    p.post_title, 
    u.user_name, 
    COUNT(c.comment_id) AS number_of_post_comments 
FROM 
    post p 
    LEFT JOIN COMMENT c 
    ON p.post_id = c.post_id 
    LEFT JOIN USER u 
    ON p.user_id = u.user_id 
GROUP BY p.post_id 
ORDER BY number_of_post_comments DESC 
+0

此查詢不會返回有效結果 – Vladimir

+0

您遇到什麼樣的錯誤? – StarsSky

+0

我已經把'post'表內容,查詢和結果放在文本文件中,你可以在這裏看到:http://ge.tt/71ld1cC1/v/0?c – Vladimir