MySql:选择所有带计数的条目

时间:2010-03-31 19:27:48

标签: php mysql

嘿伙计们快速提问,我有一个查询,我想要计算它找到的所有条目,并选择全部,所以当我使用while($row=mysql_fetch_assoc($query)){时,它会列出所有条目。我遇到的问题是,虽然所有条目都已成功计算并且列出了正确的数字,但只有当我回显$ row ['title']时才会选择并列出最新的条目。如果我删除, COUNT(*) as total,那么它会选择所有,但我想知道是否可以使用count并选择*。我想知道是否有人知道我做错了什么?

SELECT *, COUNT(*) as total FROM new_messages WHERE username='$session->username

3 个答案:

答案 0 :(得分:2)

为什么你需要计算每一行?您只需要获取一次,就可以使用mysql_num_rows

$res = mysql_query("SELECT * FROM new_messages WHERE username='$session->username");
$count = mysql_num_rows($res);

或者您可以直接获取计数:

list($count) = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM new_messages WHERE username='$session->username"));

答案 1 :(得分:1)

如果您打算获取所有记录,请计算客户端的记录(从MySQL的角度来看,即您的PHP脚本)。
如果您正在使用未缓冲的查询,则首先获取所有记录,然后调用计算结果记录的函数/方法(例如mysql_num_rows())。如果您正在使用缓冲查询,则函数/方法调用的顺序无关紧要。

p.s。:您只获得“最后一条记录”的值,因为使用像Count()这样的聚合函数而没有GROUP BY子句会使所有记录一个组。见http://dev.mysql.com/doc/refman/5.1/en/group-by-functions.html
MySQL允许您选择不属于GROUP BY子句的列,但http://dev.mysql.com/doc/refman/5.1/en/group-by-hidden-columns.html表示:

使用此功能时,每个组中的所有行对于从GROUP BY部分省略的列应具有相同的值。 服务器可以自由地从组中返回任何值,因此除非所有值都相同,否则结果是不确定的。

答案 2 :(得分:1)

首先,您不应该使用mysql_fetch_assoc(),因为mysql_函数已过时。

至少,您应该切换到使用MySQL Improved Extension (mysqli) functions或更一般的PDO功能。

如果您使用mysqli,则可以使用mysqli_result->num_rows()来计算结果中的行数,该页面上有一个代码示例,说明如何使用它。

PDO没有计算结果集中行的功能,但您可以使用fetchAll(),然后只检查您获取的数组的大小。

为了完整起见,如果你坚持mysql_函数(你不应该这样做,因为你冒着安全问题),你可以使用mysql_num_rows()