2009-11-27 89 views
0

我试图运行SQL查询并选择正常的列以及COUNT。使用PHP的SELECT COUNT(DISTINCT名称),ID,地址

$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名),”,它只会返回第一个条目。当我删除它时,它将返回数据库中的所有匹配项。

我可以分开它并做2个查询,但我试图避免这个由于性能问题。

我做错了什么? thx,Mexx

+0

你想用这个查询来达到什么目的?看起来你正在混合两种不同的东西。 – FelixM 2009-11-27 18:21:50

+0

是的,你究竟在做什么?在地址上查找具有唯一名称的人数,或同时获取用户列表和总人数? – 2009-11-27 18:55:50

+0

只需删除count()并在while()周期 – jab11 2009-11-27 20:33:49

回答

4

混合正常列和汇总功能的能力是的MySQL(MIS)功能。 你甚至可以读取它为什么如此危险的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 
+0

thx投掷正常行与摘要。这是关键。我现在使用两个查询。 – Max 2009-11-29 14:08:19

1

COUNT()是一个聚合函数,它聚合在查询的其余部分的结果上。如果要计算所有不同的名称,而不仅仅是与您正在选择的idaddress关联的不同名称,则是的,您将不得不运行两个查询。这就是SQL的工作原理。

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

0

从我个人理解,你想:每个用户

  • 一条线,让每名/ ID /地址多个用户
  • 一行在同一时间,以获得数的同名用户。

这是不太可能的,我会说。


一个解决办法是,像你说的,两个查询...

...或者,你的情况,你可以做在PHP端的数量,我想。
ie,不在查询中计数,但在PHP代码中使用额外的循环。

0

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

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

如果Id是主键,则聚合不执行任何操作。 – 2009-11-27 18:30:53

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

我假设你想要让所有的用户,并在相同的查询总数。

尝试

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