2013-02-05 117 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,但我怀疑他们不会被需要。

祝你好运。

相关问题