1

我正在尝试从我的数据库中获取一些新闻文章,并使用它获取相关项目。数据库结构如下所示:

news               (id, article        )
newsItemsRelation  (id, newsId,  itemId)
newsAuthorRelation (id, newsId,  userId)
items              (id, itemTitle      )

然后我还有一个项目表和用户数据表。

当我运行下面的查询时,如果我有同一篇文章的多个作者,我会得到重复的项目,如果我有同一篇文章的多个项目,我会得到重复的作者。

SELECT
        article,
        GROUP_CONCAT(name) AS author,
        GROUP_CONCAT(itemTitle) AS item
    FROM news
    LEFT JOIN newsItemsRelation ON
        newsItemsRelation.newsId = news.id
    LEFT JOIN items ON
        items.id = newsItemsRelation.itemId
    LEFT JOIN newsAuthorsRelation ON
        newsAuthorsRelation.newsId = news.id
    LEFT JOIN profiles ON
        profiles.id = newsAuthorsRelation.userId
    GROUP BY news.id

编辑 1

我的结果如下所示:

文章:文章在这里

作者:沃尔特·怀特、德克斯特·摩根、沃尔特·怀特、德克斯特·摩根

项目:绝命毒师,德克斯特,绝命毒师,德克斯特

编辑 2

GROUP_CONCAT(DISTINCT name)ORGROUP_CONCAT(DISTINCT itemTitle)并不能解决我的问题,因为多个项目可以具有相同的 itemTitle 但不同的 ID。作者也是如此。这意味着我的结果可能看起来像“Dexter,Dexter”,但现在看起来像“Dexter,Dexter,Dexter,Dexter”

4

3 回答 3

2

您的问题是您的项目和您的作者之间没有关联。因此,对于每个作者和每个项目,您都会得到重复的结果。

尝试这样的事情:

    SELECT
        article,
        author,
        item
    FROM news
    LEFT JOIN (
      SELECT 
           News.Id as NewsId,
           GROUP_CONCAT(itemTitle) AS item
       FROM news
       LEFT JOIN newsItemsRelation ON
           newsItemsRelation.newsId = news.id
       LEFT JOIN items ON
           items.id = newsItemsRelation.itemId
       GROUP BY News.Id
      ) items on news.Id = items.NewsId
    LEFT JOIN (
       SELECT 
           News.Id as NewsId,
           GROUP_CONCAT(Name) AS Author
       FROM news
       LEFT JOIN newsAuthorsRelation ON
           newsAuthorsRelation.newsId = news.id
       LEFT JOIN profiles ON
           profiles.id = newsAuthorsRelation.userId
       GROUP BY News.Id
      ) Authors on news.Id = Authors.NewsId

还有SQL 小提琴

祝你好运!

于 2013-01-25T23:39:06.460 回答
1

尝试按文章分组并对名称进行 DISTINCT

SELECT
        article,
        GROUP_CONCAT(DISTINCT name) AS author,
        GROUP_CONCAT(DISTINCT itemTitle) AS item
    FROM news
    LEFT JOIN newsItemsRelation ON
        newsItemsRelation.newsId = news.id
    LEFT JOIN items ON
        items.id = newsItemsRelation.itemId
    LEFT JOIN newsAuthorsRelation ON
        newsAuthorsRelation.newsId = news.id
    LEFT JOIN profiles ON
        profiles.id = newsAuthorsRelation.userId
    GROUP BY article
于 2013-01-25T22:40:24.763 回答
-1

当我遇到这个问题时,我所做的就是使查询成为子查询并从那里过滤。另一种方法是列子查询方法(讨厌这种方法,因为它非常昂贵)。

于 2013-01-25T23:32:39.990 回答