繁体   English   中英

SELECT COUNT(DISTINCT名),ID,用户的地址

[英]SELECT COUNT(DISTINCT name), id, adress from users

使用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个查询,但是由于性能方面的原因,我试图避免这种情况。

我怎么做错了? 谢谢,Mexx

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

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

请注意,聚合时还应该有一个group by子句。 我认为MySQL不需要它的事实太可怕了,它会养成真正的坏习惯。

据我了解,您想获得:

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

我会说这不太可能。


如您所说,一个解决方案是两个查询...

...或者,就您而言,我想您可以在PHP方面进行计数。
即,不计入查询,而是在PHP代码中使用附加循环。

当count()作为字段列表的一部分时,应将其余字段分组。 在你的情况下

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

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

尝试

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM