【问题标题】:SELECT COUNT(DISTINCT name), id, adress from usersSELECT COUNT(DISTINCT name), id, address from users
【发布时间】:2009-11-27 18:15:32
【问题描述】:

我正在尝试使用 PHP 运行 SQL 查询并选择普通列以及 COUNT。

$sql_str =  "select COUNT(DISTINCT name), id, adress from users";
$src = mysql_query($sql_str);

while( $dsatz = mysql_fetch_assoc($src) ){
    echo $dsatz['name'] . "<br>";
}

问题是当我的查询中有“COUNT(DISTINCT name)”时,它只会返回第一个条目。当我删除它时,它会从数据库中返回所有匹配的条目。

我可以将其分开并执行 2 个查询,但出于性能考虑,我试图避免这种情况。

我做错了什么? 谢谢,墨西哥

【问题讨论】:

  • 你想用这个查询来达到什么目的?看起来你正在混合两种不同的东西。
  • 是的,你到底想做什么?查找地址中具有唯一名称的人数或同时获取用户列表和总人数?
  • 只需删除 count() 并在您的 while() 循环中执行 $counter++
  • 感谢所有答案。明天会读。只是为了澄清:是的,我想在 1 个查询中做 2 件事。计算不同的名称条目(有些出现不止一次)并从所有行中获取值 id、address。
  • 我同意 jab11,计算循环中的唯一值。不需要两个查询,您已经选择了所有值。如果您按名称订购,您可以轻松地将当前值与以前的值进行比较,并在值更改时增加计数器。如果您不按名称排序,则需要保留一个关联的名称数组。

标签: php sql count


【解决方案1】:

混合普通列和聚合函数的能力是 MySQL 的一个(错误)特性。 您甚至可以在 MySQL 的文档中了解它为何如此危险: https://dev.mysql.com/doc/refman/5.6/en/group-by-extensions.html

但如果你真的想在一个查询中混合普通行和摘要,你总是可以使用 UNION 语句:

SELECT COUNT(DISTINCT name), null, null FROM users GROUP BY name --summary row
UNION
SELECT name, id, address FROM users --normal rows

【讨论】:

  • 感谢在正常行与摘要中的投入。这就是重点。我现在使用两个查询。
【解决方案2】:

COUNT() 是一个聚合函数,它根据您查询的其余部分的结果进行聚合。如果您想计算所有不同的名称,而不仅仅是与您选择的 idaddress 关联的不同名称,那么是的,您将必须运行两个查询。这就是 SQL 的工作原理。

请注意,聚合时还应该有一个group by 子句。我认为 MySQL 不需要它的事实是可怕的,它鼓励了非常坏的习惯。

【讨论】:

    【解决方案3】:

    据我了解,你想得到:

    • 每个用户一行,获取每个名称/id/地址
    • 一行同时给多个用户,获取同名用户的数量。

    我会说,这不太可能。


    就像你说的,一个解决方案是两个查询......

    ... 或者,在您的情况下,您可以在 PHP 端进行计数,我想。
    即,不计入查询,但在您的 PHP 代码中使用附加循环。

    【讨论】:

      【解决方案4】:

      当您将 count() 作为字段列表的一部分时,您应该对其余字段进行分组。在你的情况下,那将是

      select count(distinct name), id, adress from users group by id, adress
      

      【讨论】:

      • 如果 Id 是主键,聚合什么也不做。
      【解决方案5】:
      select count(distinct name), id, adress 
      from users 
      group by id, adress
      

      【讨论】:

        【解决方案6】:

        我假设您想在同一个查询中获取所有用户和总数。

        试试

          select name, id, address, count(id) as total_number 
            from users 
            group by name, id, address;
        

        【讨论】:

          猜你喜欢
          • 2014-06-17
          • 1970-01-01
          • 1970-01-01
          • 2012-10-13
          • 2021-03-19
          • 1970-01-01
          • 2015-01-28
          • 1970-01-01
          • 2017-12-19
          相关资源
          最近更新 更多