【问题标题】:MySQL: Duplicate values when joining from multiple tablesMySQL:从多个表连接时重复值
【发布时间】:2013-01-25 22:37:34
【问题描述】:

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

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

【问题讨论】:

  • 要回答您的问题,查看一些示例数据和所需的输出会很有帮助。另外,我假设您尝试过使用 DISTINCT 关键字?
  • 在不同的id 中有相同的article 吗?
  • 你也能显示items的表结构吗?
  • @sgeddes 多个作者可以有相同的名字。
  • 一篇文章只能有一个 news.id 但一个 news.id 可以连接到多个项目和/或作者。

标签: mysql sql database left-join


【解决方案1】:

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

试试这样的:

    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

祝你好运!

【讨论】:

    【解决方案2】:

    尝试按文章分组并对名称进行 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
    

    【讨论】:

    • 多个项目和作者可能具有相同的名称但不同的ID。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2017-07-23
      • 2015-01-08
      • 2012-05-20
      • 2013-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多