Nasıl optimize veya bu MySQL sorguları birleştirebilirsiniz?

2 Cevap php

I want to check for the username in the users table.
If it's found, then I want to get the id.
Otherwise, I want to insert the username as a new record, then get the id.
Here's my code:

<?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();
}
?>

Nasıl optimize veya bu MySQL sorguları birleştirebilirsiniz?

Ben seçmek ve aynı sorguda ekleyebilirsiniz?

ve daha iyi ve daha hızlı olurdu?

2 Cevap

Bu INSERT ilk adı yok varsayımı ile daha iyidir. Herhangi bir hata, yinelenen bir çatışma neden ise, SELECT varolan satır.

<?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"];
    }
}
?>

Bu daha iyidir nedeni eklemek sonra seçerseniz, başkasının iki SQL tabloları arasındaki an adını eklemek olabilir olmasıdır.

Tabii ki users.username bir UNIQUE kısıtlaması olmalıdır.


Yorumlarınız Re: evet, bu daha hızlı komut o olmalıdır. (Muhtemelen daha sık görülür) herhangi bir yinelenen adı olduğunda, size SELECT çalıştırmak zorunda değilsiniz.

The best way to optimize an SQL query is not to run it at all.

Eğer bu hızlı emin indeksi username yapmak istiyorsanız.