使用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仍然在评论中运作。
答案 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