DISTINCT的问题!

时间:2009-10-05 16:58:48

标签: sql mysql

这是我的问题:

SELECT 
DISTINCT `c`.`user_id`,
`c`.`created_at`,
`c`.`body`,
(SELECT COUNT(*) FROM profiles_comments c2 WHERE c2.user_id = c.user_id AND c2.profile_id = 1) AS `comments_count`,
`u`.`username`,
`u`.`avatar_path` 
FROM `profiles_comments` AS `c` INNER JOIN `users` AS `u` ON u.id = c.user_id 
WHERE (c.profile_id = 1) ORDER BY `u`.`id` DESC;

有效。但问题在于DISTINCT字。据我了解,它应该每个c.user_id只选择一行。

但我得到的甚至是4-5行,具有相同的c.user_id列。问题在哪里?

5 个答案:

答案 0 :(得分:9)

实际上,DISTINCT并没有将自己限制在1列,基本上当你说:

SELECT DISTINCT a,b

你所说的是,“给我一个明显的a和b组合值”......就像一个多列的UNIQUE索引

答案 1 :(得分:6)

distinct将确保select子句中的所有值都是唯一的,而不仅仅是user_id。如果要将结果限制为单个user_id,则应按user_id进行分组。

也许你想要的是:

SELECT 
`c`.`user_id`,
`u`.`username`,
`u`.`avatar_path`,
(SELECT COUNT(*) FROM profiles_comments c2 WHERE c2.user_id = c.user_id AND c2.profile_id = 1) AS `comments_count` 
FROM `profiles_comments` AS `c` INNER JOIN `users` AS `u` ON u.id = c.user_id 
WHERE (c.profile_id = 1) 
GROUP BY `c`.`user_id`,
`u`.`username`,
`u`.`avatar_path`
ORDER BY `u`.`id` DESC;

答案 2 :(得分:2)

DISTINCT在行级别工作,而不仅仅是列级别

如果你想只有一列的DISTiNCT那么你必须聚合返回的其余列(MIN,MAX,SUM,AVG等)

SELECT DISTINCT (Name), Min (ID)
From MyTable

答案 3 :(得分:1)

Distinct将尝试仅返回唯一的行,在您的示例中,每个用户ID不会返回1行。

http://dev.mysql.com/doc/refman/5.0/en/distinct-optimization.html

答案 4 :(得分:1)

你误解了。 DISTINCT修饰符适用于整行 - 它声明在结果集中不会返回两个相同的ROWS。

查看您的SQL,您希望在created_at列(例如)中返回的几个可用值是多少?无法按照书面形式预测查询结果。

此外,您在SELECT中使用了两次profile_comments。您似乎正在尝试获取每个用户评论的次数。如果是这样,您要做的是使用AGGREGATE查询,该查询分组在user_id上,并且仅包括唯一标识用户的那些列以及COUNT个注释:

SELECT user_id,COUNT(*)FROM profile_comments WHERE profile_id = 1 GROUP BY user_id

如果需要,可以将连接添加到用户以获取用户名,但从逻辑上讲,结果集不能包含profile_comments中的其他列,并且每个user_id仍然只生成一行,除非这些列也以某种方式聚合:

SELECT user_id,MIN(created_at)AS Earliest,MAX(created_at)AS Latest,COUNT(*)FROM profile_comments WHERE profile_id = 1 GROUP BY user_id