代码之家  ›  专栏  ›  技术社区  ›  Richard Knop

不同的问题!

  •  2
  • Richard Knop  · 技术社区  · 15 年前

    这是我的问题:

    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_id选择一行。

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

    5 回复  |  直到 15 年前
        1
  •  9
  •   Matt    15 年前

    实际上,distinct并不限制自己为1列,基本上当您说:

    选择不同的A、B

    你要说的是,“给我A和B组合的独特值”。就像多列唯一索引一样

        2
  •  6
  •   Matt Wrock    15 年前

    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;
    
        3
  •  2
  •   Raj More    15 年前

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

    如果只需要一列的distinct,则必须聚合返回的其余列(min、max、sum、avg等)。

    SELECT DISTINCT (Name), Min (ID)
    From MyTable
    
        4
  •  1
  •   brendan    15 年前

    distinct将尝试只返回唯一的行,在您的示例中,它不会只返回每个用户ID一行。

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

        5
  •  1
  •   Larry Lustig    15 年前

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

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

    另外,您在选择中使用了两次配置文件注释。似乎您正在尝试获取每个用户评论次数的计数。如果是这样,您要做的是使用聚合查询,按用户ID分组,并且只包括那些唯一标识用户的列以及注释计数:

    从profile_comments中选择user_id,count(*),其中profile_id=1 group by user_id

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

    从profile_comments中选择user_id,min(created_at)最早,max(created_at)最晚,count(*),其中profile_id=1 group by user_id