Sql 问题与明确!

Sql 问题与明确!,sql,mysql,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

我的问题是:

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;
它起作用了。但问题在于这个词的独特性。据我所知,它应该只为每个c.user\u id选择一行


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

事实上,DISTINCT并没有将其自身限制为1列,基本上当您说:

选择不同的a、b


你的意思是,“给我a和b的组合的不同值”。。就像多列唯一索引一样,distinct将确保select子句中的所有值都是唯一的,而不仅仅是用户id。如果要将结果限制为单个用户id,则应按用户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;

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

如果只需要一个列的DISTiNCT,则必须聚合返回的其余列(MIN、MAX、SUM、AVG等)


Distinct将尝试只返回唯一的行,在您的示例中,它不会为每个用户id只返回1行


你误解了。DISTINCT修饰符应用于整行-它表示结果集中不会返回两个相同的行

看看您的SQL,您希望在created_at列(例如)中看到返回的几个可用值是什么?不可能预测所写查询的结果

此外,您在SELECT中使用了两次profile_注释。似乎您正在尝试获取每个用户评论的次数计数。若是这样的话,您要做的是使用一个聚合查询,根据用户id分组,只包括那个些唯一标识用户的列以及注释计数:

从配置文件注释中选择用户标识,计数(*),其中配置文件标识=1按用户标识分组

如果需要,可以向用户添加联接以获取用户名,但从逻辑上讲,结果集不能包含来自概要文件\u注释的其他列,并且仍然只能为每个用户\u id生成一行,除非这些列也以某种方式聚合:


选择user_id,MIN(created_at)为最早,MAX(created_at)为最晚,COUNT(*)FROM profile_comments,其中profile_id=1 groupby user_id

,您需要确定要返回的多行中的哪一行。如果选择“最大值”、“最小值”或其他选项,则会产生很大的差异。此外,如果您希望每列中的dqata来自同一条记录,则它可能比仅使用min()函数更复杂。@HLGEM绝对正确。可以使用聚合函数实现DISTINCT,但除非您理解其含义,否则这显然不是一个好主意。
SELECT DISTINCT (Name), Min (ID)
From MyTable