SELECT COUNT(id)问题

时间:2014-03-31 09:21:32

标签: php mysql mysqli

我一直在使用此命令检索具有相同电子邮件地址的字段数:

$query = $db->query("SELECT COUNT(`user_id`) FROM `users` WHERE `email`='$email'") or die($db-error);

users表中有3条记录具有相同的电子邮件地址。问题是当我把*而不是COUNT(user_id)正确地返回时:$query->num_rows给出3但是当我使用COUNT(user_id)时,$query->num_rows会一直返回1。我怎样才能纠正这个或者我的问题在哪里?

3 个答案:

答案 0 :(得分:0)

当您对该查询使用$query->num_rows时,它将仅返回1行,因为只返回一个计数。

实际行数将包含在该查询中。如果要将结果作为对象,或关联数组为计数指定名称:

$query = $db->query("SELECT COUNT(`user_id`) AS total FROM `users` WHERE `email`='$email'") or die($db-error);

在返回的查询total中应该是3,而$query->num_rows仍然是1.如果您只想快速使用$total = $query->fetchColumn();这个值。

正如其他人所说的那样,请注意NULL用户ID,因为COUNT()会忽略它们。

答案 1 :(得分:0)

  1. 用户表中的电子邮件必须是无用的。因此,你根本不需要计算。
  2. 你应该使用准备好的陈述。
  3. 您不应发布永不运行的代码。
  4. 这是运行此类查询的唯一正确方法:

    $sql = "SELECT * FROM `users` WHERE `email`=?";
    $stm = $db->prepare($sql);
    $stm->execute([$email]);
    $user = $stm-fetch();
    

    (代码是由于错误的标记而编写的。对于mysqli,您将需要另一个代码,但指南保持不变。)

    像这样的东西

    $sql = "SELECT * FROM `users` WHERE `email`=?";
    $stm = $db->prepare($sql);
    $stm->bind_param('s',$email);
    $stm->execute();
    $res = $stm->get_result()
    $user = $res->fetch_assoc();
    

    $user变量中,您将拥有以下代码中需要的用户数据或false,这意味着找不到用户。因此,$user可以在if()语句中使用,无需任何计数。

    如果您确实需要计算行数,那么您可以使用此尝试的count()方法。您可以使用this answer中的函数:

    $count = getVar("SELECT COUNT(1) FROM users WHERE salary > ?", $salary);
    

答案 2 :(得分:-1)

这是正确的行为:如果使用COUNT函数,则select查询的结果只是一行,其中一列包含数据集的数量。

因此,您可以检索具有给定电子邮件地址的用户数量,如下所示:

$query = $db->query("SELECT COUNT(`user_id`) FROM `users` WHERE `email`='$email'") or die($db-error);
$row = $query->fetch_row();
$count = $row[0];

请注意,这比使用SELECT *查询所有数据并检查$query->num_rows要快,因为它不需要实际获取数据。