2013-02-05 40 views
1

我試圖找到一個SQL查詢,最終得到1行包含文章標題及其關聯的關鍵字。一個SQL查詢可以從多對多關係中獲得一行嗎?

Articles 
-ArticleID PK 
-ArticleTitle 
-ArticleBody 

Keywords 
-KeywordID PK 
-Keyword UNIQUE 

Keyword_Article 
-KeywordID PK 
-ArticleID PK 

這可能沒有多個查詢在PHP中?

我有什麼,給了我許多行因爲有每篇文章

SELECT Article.ArticleID, 
Article.ArticleTitle, 
Keywords.Keyword, 
Keywords.KeywordID 
FROM Article 
LEFT JOIN Keyword_Article 
ON (Keyword_Article.ArticleID = Article.ArticleID) 
LEFT JOIN Keywords 
ON (Keyword_Article.KeywordID = Keywords.KeywordID) 
WHERE Article.ArticleID='example' 

關鍵字我很好奇,看看如何以及它是否能與一個SQL語句來完成。

+1

肯定。查看GROUP_CONCAT以將文章ID和連接成一個字符串的關鍵字列表返回。 http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat – ryan1234

回答

3

您不能有一個SQL語句返回可變數量的列。因此,不能將每個關鍵字放在一個單獨的列中,其列數會因文章而異(除非使用動態SQL)。

您可以連接關鍵字一起到使用group_concat單個列:

SELECT Article.ArticleID, Article.ArticleTitle, 
     group_concat(Keywords.Keyword separator ', ') as keywords 
FROM Article LEFT JOIN 
    Keyword_Article 
    ON Keyword_Article.ArticleID = Article.ArticleID EFT JOIN 
    Keywords 
    ON Keyword_Article.KeywordID = Keywords.KeywordID 
WHERE Article.ArticleID = 'example' 
+0

很酷。感謝您的額外信息和分隔符選項。 – chris

1

你應該考慮使用GROUP_CONCAT()

SELECT Article.ArticleID, 
    Article.ArticleTitle, 
    GROUP_CONCAT(Keywords.Keyword) as Keywords 
FROM Article 
    LEFT JOIN Keyword_Article 
     ON (Keyword_Article.ArticleID = Article.ArticleID) 
    LEFT JOIN Keywords 
     ON (Keyword_Article.KeywordID = Keywords.KeywordID) 
WHERE Article.ArticleID='example' 

在查詢您傳回KeywordId爲好。您也可以對這些使用GROUP_CONCAT,但我懷疑他們不會被需要。

祝你好運。

相關問題