Как я могу оптимизировать или объединить эти запросы MySQL? - PullRequest
0 голосов
/ 16 сентября 2009

Я хочу проверить имя пользователя в таблице 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?

Могу ли я выбрать и вставить в тот же запрос?

и будет ли лучше и быстрее?

Ответы [ 2 ]

1 голос
/ 16 сентября 2009

Если вы хотите, чтобы это было быстро, убедитесь, что вы индексировали username.

0 голосов
/ 17 сентября 2009

Лучше сначала 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.

Конечно, у вас должно быть ограничение UNIQUE на users.username.


Ваш комментарий: да, ваш сценарий должен быть быстрее. Когда нет повторяющегося имени пользователя (что, вероятно, более распространено), вам не нужно запускать SELECT.

Лучший способ оптимизировать SQL-запрос - не запускать его вообще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...