SQL Distinct列,包含来自同一表的其他信息

时间:2014-12-09 18:36:33

标签: mysql sql distinct

使用SQL变得更好,所以我很抱歉这很简单。

如果我将DISTINCT关键字添加到查询中,我将获得一个DISTINCT行,但如果我只想要一个DISTINCT列,并且该行上的其他列已加入,那该怎么办。

例如

id | name | comment
-------------------------------
1  | John | Happy Holidays!
2  | Bill | Merry Christmas!
3  | Dave | Happy New Year!
4  | John | Happy Thanksgiving!
5  | John | Happy Holidays!
6  | Dave | Happy Thanksgiving!

在这张桌子上,运行SELECT DISTINCT name, comment会给我:

John | Happy Holidays!
Bill | Merry Christmas!
Dave | Happy New Year!
John | Happy Thanksgiving!
Dave | Happy Thanksgiving!

但是,我希望只是 DISTINCT的名称,然后是任何评论属于该记录。所以我的结果是:

John | Happy Holidays!
Bill | Merry Christmas!
Dave | Happy New Year!

其他约翰和戴夫的评论也没关系,只要这些名字是DISTINCT我就不在乎我得到哪一个。

我最初的想法是加入评论后:

SELECT DISTINCT a.name, b.comment FROM userComments a JOIN userComments b ON a.id = b.id

但DISTINCT仍然在评论中运作。

2 个答案:

答案 0 :(得分:2)

按名称分组以获取给定名称的单个记录。

SELECT a.name, b.comment 
FROM   userComments a JOIN userComments b ON a.id = b.id
GROUP BY a.name;

注意:这不是确定性的,会从不确定的匹配行中提取注释。

答案 1 :(得分:1)

要将此限制为每个用户name列出的第一个评论,您确实需要将MIN()汇总应用于id并使用该汇总加入反对整个桌子。您也可以使用MAX(id)

SELECT 
  userComments.name,
  userComments.comment
FROM
  userComments
  JOIN (
    SELECT name, 
      MIN(id) AS id
    FROM userComments
    GROUP BY name
  ) one_comment ON userComments.id = one_comment.id

这是一个示范。 http://sqlfiddle.com/#!2/b8e0c/3

如果您想通过对评论进行排序来按字母顺序执行此操作,您还可以使用MAX(comment)MIN(comment),但之后您需要跨两列执行联接以唯一标识:

ON one_comment.comment = userComments.comment AND one_comment.name = userComments.name