这是我的问题:
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列。问题在哪里?
答案 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