【问题标题】:How can I optimize or combine these MySQL queries?如何优化或组合这些 MySQL 查询?
【发布时间】:2009-09-16 19:48:40
【问题描述】:
我想检查users 表中的用户名。
如果找到了,我想得到id。
否则,我想将用户名作为新记录插入,然后获取id。
这是我的代码:
<?PHP
$sql = "SELECT id FROM users where username = '$username'";
$query = mysql_query($sql) or die(mysql_error());
$result = mysql_num_rows($query);
if($result){
$row = mysql_fetch_array($query);
$userid = $row["id"];
}else{
$sql = "insert into users set username = '$username'";
$query = mysql_query($sql) or die(mysql_error());
$userid = mysql_insert_id();
}
?>
如何优化或组合这些 MySQL 查询?
我可以在同一个查询中选择和插入吗?
它会更好更快吗?
【问题讨论】:
标签:
php
sql
mysql
optimization
【解决方案2】:
最好先INSERT,假设用户名不存在。如果任何错误是由重复冲突引起的,SELECT 现有行。
<?php
$sql = "INSERT INTO users SET username = '"
. mysql_real_escape_string($username) . "'";
$query = mysql_query($sql);
if ($query === true) {
$userid = mysql_insert_id();
} else {
if (mysql_errno() != 1022) { // this is the duplicate key error code
die(mysql_error());
}
$sql = "SELECT id FROM users where username = '"
. mysql_real_escape_string($username) . "'";
$query = mysql_query($sql) or die(mysql_error());
$row = mysql_fetch_array($query);
if ($row !== false) {
$userid = $row["id"];
}
}
?>
这样做更好的原因是,如果您选择然后插入,其他人可能会在您的两个 SQL 语句之间插入用户名。
当然你应该对users.username 有一个UNIQUE 约束。
您的评论:是的,它应该比您的脚本更快。当没有重复的用户名(这可能更常见)时,您不必运行SELECT。
优化 SQL 查询的最佳方法是根本不运行它。