SELECT COUNT(DISTINCT name),id,来自用户的地址

时间:2009-11-27 18:15:33

标签: php sql count

使用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名称)”时,它只会返回第一个条目。当我删除它时,它将返回db中的所有匹配条目。

我可以将它分开并进行2次查询,但由于性能问题,我试图避免这种情况。

我做错了什么? thx,Mexx

6 个答案:

答案 0 :(得分:4)

混合普通列和聚合函数的能力是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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

据我所知,你想得到:

  • 每个用户一行,以获取每个名称/ ID /地址
  • 同时为多个用户创建一行,以获取具有相同名称的用户数。

这是不可能的,我会说。


像你说的那样,解决方案就是两个问题......

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

尝试

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