Если SELECT id != Null то id иначе INSERT

331
24 декабря 2016, 18:49

Описание проблемы: есть 2 таблицы tabel_home и table_users и они связаны 1 ко многим и при добавлении новой записи в таблицу tabel_home приходится проверять есть запись в tabel_users, если есть получать её id если нет добавлять и получать id.

Сейчас использую php для решения данное:

function GetUserId($user_name, $mysqli) {
    $sql_select = "SELECT id FROM tabel_users WHERE user = $user_name;";
    if($result_id = $mysqli->query($sql_select)) {
        if($result_id != Null) {
            return $result_id->fetch_assoc()['id'];
        } else {
            $sql_insert = "INSERT INTO tabel_users (user) VALUE ($user_name);";
            $mysqli->query($sql_insert);
            return $mysqli->insert_id;
        }
    } else { 
        return False;
    }
}

Но интересно есть более быстрый и удобный способ получений или добавление записи и получения её id и желательно использую SQL.

Answer 1

Самое простое решение - это без всяких проверок выполнить вставку. Если такой записи нет - она вставится. Если есть, то ограничение уникального индекса tabel_users(user) (надеюсь, таковой имеется? иначе всё описанное в вопросе не имеет смысла) не позволит вставить - но эту ошибку надо просто проигнорировать. После этого - неважно, какой из вариантов имел место,- запись в таблице ЕСТЬ. Значит, можно спокойно делать SELECT id для дальнейшего употребления. Иными словами:

function GetUserId($user_name, $mysqli) {
    $sql_insert = "INSERT IGNORE INTO tabel_users (user) VALUE ($user_name);";
    $mysqli->query($sql_insert);
    $sql_select = "SELECT id FROM tabel_users WHERE user = $user_name;";
    return $mysqli->query($sql_select));
}

UPD:

Или сразу

function GetUserId($user_name, $mysqli) {
    $sql = "INSERT IGNORE INTO tabel_users (user) VALUE ($user_name); SELECT id FROM tabel_users WHERE user = $user_name;";
    return $mysqli->query($sql));
}

PS. Поправьте return, чтобы получить второй рекордсет, который от SELECT-a. Я в пхп не силён...

READ ALSO
Пагинация для каждой статьи в codeigniter [требует правки]

Пагинация для каждой статьи в codeigniter [требует правки]

Как разбить страницу состоящую из тысяч строк текста на много страниц (пагинация) в codeigniter?

384
Как экранировать специальные символы?

Как экранировать специальные символы?

Уже не первый сталкиваюсь с тем, что, когда в поле с типом TEXT вместе с текстом записывается символ плюс (+), получаю не корректное поведениеЛибо...

355
PHP+ZipArchive+РусскийЯзык=Кракозябры

PHP+ZipArchive+РусскийЯзык=Кракозябры

ЗдравствуйтеПомогите решить проблему: есть zip-архив неизвестно где и как созданный, нужно распаковать все файлы во вложенную папку, причем...

369
Как получить пользователей онлайн?

Как получить пользователей онлайн?

Сейчас я делаю так: при каждой загрузке страницы, я обновляю в кеше ключ "{$user->id}online" на 5 мин

327