MySQL:从多个表连接时重复值

时间:2013-01-25 22:37:34

标签: mysql sql database left-join

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

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

我的结果如下:

文章:文章在这里

作者:Walter White,Dexter Morgan,Walter White,Dexter Morgan

项目:打破坏,德克斯特,打破坏,德克斯特

编辑2

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

3 个答案:

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

祝你好运!

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

答案 2 :(得分:-1)

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