检查记录是否存在的最简洁方法

时间:2016-05-07 22:31:17

标签: php mysql sql count

我使用以下代码检查数据库中是否存在行:

$sql = "SELECT COUNT(1) FROM myTable WHERE user_id = :id_var";
$stmt = $conn->prepare($sql);
$stmt->bindParam(':id_var', $id_var);
$stmt->execute();

if ($stmt->fetch()[0]>0)
{
    //... many lines of code
}

如果前面的代码干净有效或者还有改进的余地,那么所有的代码都可以解决我的问题。

目前有两个问题困扰我以前的代码:

  1. 我的SQL语句末尾应该有LIMIT 1吗? COUNT(1)是否已将发现的行数限制为1,或者即使在找到第一个记录之后服务器是否继续搜索更多记录?
  2. if ($stmt->fetch()[0]>0)。这是从SQL查询中获取信息并执行“if conditional”的最简洁方法吗?
  3. 当然,如果有人发现任何其他可以改善我的代码的内容,我会很乐意反馈你。

1 个答案:

答案 0 :(得分:3)

问:我的SQL语句结尾处是否应该有LIMIT 1? COUNT(1)是否已将发现的行数限制为1,或者即使在找到第一个记录之后服务器是否继续搜索更多记录?

如果执行成功,您的SELECT COUNT() FROM查询将返回一行,因为没有GROUP BY子句。没有必要添加LIMIT 1子句,它不会有任何影响。

数据库将搜索满足WHERE子句中条件的所有行。如果user_id列是UNIQUE,并且有一个索引作为前导列,或者,如果该列是表的PRIMARY KEY ...那么使用索引搜索所有匹配的行将是高效的。如果没有索引,那么MySQL将需要搜索表中的所有行。

索引为您带来了良好的表现。您可以以不同方式编写查询,以获得可用的结果。但是你拥有的很好。

问:这是最干净的......

  if ($stmt->fetch()[0]>0)

我个人的偏好是避免这种结构,并将其分解为两个或更多的陈述。正常模式...单独的语句来获取行,然后进行测试。

就个人而言,我倾向于避免使用COUNT()并获取一行,并测试是否有一行要获取...

  $sql = "SELECT 1 AS `row_exists` FROM myTable WHERE user_id = :id_var";
  $stmt = $conn->prepare($sql);
  $stmt->bindParam(':id_var', $id_var);
  $stmt->execute();
  if($stmt->fetch())  {
      // row found
  } else {
      // row not found 
  }
  $stmt->closeCursor(); 
相关问题