使用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
答案 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()
是一个聚合函数,它会根据查询的其余部分进行聚合。如果要计算所有不同的名称,而不仅仅是与您选择的id
和address
关联的不同名称,那么是的,您将需要运行两个查询。这就是SQL的工作方式。
请注意,聚合时您还应该有group by
子句。我认为MySQL不需要它的事实是可怕的,它鼓励了非常坏的习惯。
答案 2 :(得分:0)
据我所知,你想得到:
这是不可能的,我会说。
像你说的那样,解决方案就是两个问题......
...或者,在你的情况下,我想你可以在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;