2013-02-23 60 views
1

我正在創建一篇文章,該文章可以包含標籤和評論。我想嘗試並獲得正確的SQL來獲得一個查詢。 我有4個表:MySQL加入3個表並計算另一個

article 
+------------+-----------------+------------+ 
| article_id | title   | photo  | 
+------------+-----------------+------------+ 
|   1 | This is a test | image1.jpg | 
|   2 | Another Article | image2.jpg | 
+------------+-----------------+------------+ 


article_tag 
+------------+--------+ 
| article_id | tag_id | 
+------------+--------+ 
|   1 |  1 | 
|   1 |  2 | 
|   2 |  2 | 
+------------+--------+ 

tags 
+--------+------+ 
| tag_id | name | 
+--------+------+ 
|  1 | tag1 | 
|  2 | tag2 | 
+--------+------+ 

comment 
+------+---------+------------+ 
| name | message | article_id | 
+------+---------+------------+ 
| 1 | hello |   1 | 
| 2 | a  |   2 | 
+------+---------+------------+ 

我試圖讓這個:

+------------+----------------+------------+---------+----------+ 
| article_id | title   | photo  | tag_ids | comments | 
+------------+----------------+------------+---------+----------+ 
|   1 | This is a test | image1.jpg | 1,2  |  1 | 
+------------+----------------+------------+---------+----------+ 

這是我到目前爲止有:

SELECT a.article_id, a.title, a.photo, a.date, a.description_long, a.author, GROUP_CONCAT(tag_id) as `tag_ids`, COUNT(c.comment_id) as comments 
FROM article as a 
JOIN article_tag as at 
ON a.article_id = at.article_id 
LEFT JOIN comment as c 
ON a.article_id = c.article_id 
WHERE a.article_id = 1 

但我發現了批示2而不是1? 謝謝 PS如果有人知道一種方式,以便我可以將tag_ids從1,2更改爲tag1,那麼tag2將會非常驚人:-)

+0

有沒有所謂的'comment_id'在你的評語表列... – Terry 2013-02-23 22:39:01

+0

數不同,它返回因爲與商品標籤中加入 – jazzytomato 2013-02-23 22:41:57

+0

對不起忘了包括2號線在問題中。但我有一個 – supajason 2013-02-24 18:01:44

回答

0

這是由於這樣的事實,存在多於1個標記,所以產生2行。

試試COUNT(DISTINCT c.comment_id)。這將只計算不同的評論ID,所以重複的不會被計算兩次。

要獲取標籤名稱,請使用標籤表格進行左連接。然後使用名稱列而不是tag_id列進行GROUP_CONCAT。

下面是它應該是什麼:

SELECT a.article_id, a.title, a.photo, a.date, a.description_long, a.author, GROUP_CONCAT(d.name) AS `tag_names`, COUNT(DISTINCT c.comment_id) AS comments 
FROM article as a 
JOIN article_tag as at 
ON a.article_id = at.article_id 
LEFT JOIN comment as c 
ON a.article_id = c.article_id 
LEFT JOIN tags d ON at.tag_id = d.tag_id 
WHERE a.article_id = 1 
+0

順便說一句,如果你想一次有多個文章的這個信息,用GROUP BY替換WHERE子句a.article_id – 2013-02-23 23:10:35

+0

謝謝你的工作。我不得不DISTINCT GROUP_CONCAT(d.name) 令人驚歎:-) – supajason 2013-02-24 18:03:25

1

標籤和註釋是獨立的。所以,如果你有三個標籤和兩個評論,你會在組合中獲得6行。

解決在MySQL此查詢的最簡單的方法是做一個組,在選擇使用不同的:

SELECT a.article_id, a.title, a.photo, a.date, a.description_long, a.author, 
     GROUP_CONCAT(distinct tag_id) as `tag_ids`, COUNT(distinct c.comment_id) as comments 
FROM article a JOIN 
    article_tag as at 
    ON a.article_id = at.article_id LEFT JOIN 
    comment c 
    ON a.article_id = c.article_id 
WHERE a.article_id = 1 
group by a.article_id 

我想說,雖然,「正確」的方式來解決該查詢修復連接。這使用在子查詢from

from . . . 
    (select article_id, group_concat(tag_id) as tags 
     from tags 
     group by article_id 
    ) at 
    . . . 
    (select article_id, count(*) as numComments 
     from comments 
     group by article_id 
    ) c 
    . . .