一个SQL查询可以从多对多关系中获取一行吗?

时间:2013-02-05 02:41:59

标签: mysql sql database

我正在尝试查找一个SQL查询,最后得到包含文章标题及其关联关键字的1行。

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'

我很想知道如何以及是否可以使用1个SQL查询来完成。

2 个答案:

答案 0 :(得分: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'

答案 1 :(得分: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,但我怀疑它们不需要。

祝你好运。