За последние 24 часа нас посетили 53918 программистов и 1717 роботов. Сейчас ищут 878 программистов ...

SELECT INSERT UPDATE одним запросов

Тема в разделе "PHP для новичков", создана пользователем ng0d, 7 фев 2012.

  1. ng0d

    ng0d Активный пользователь

    С нами с:
    7 фев 2009
    Сообщения:
    100
    Симпатии:
    0
    Адрес:
    Латвия
    Можно ли как то сделать из этого кода не 2 запроса, а один? REPLACE, ON DUPLICATE KEY тут могут помочь или нет?

    Код (PHP):
    1.     // функция гостей профиля
    2.     if (is_numeric($_GET['user']) and !$_GET['search']) {
    3.         $resultUserGuests = mysql_query("SELECT * FROM " . $dbPrefix .
    4.             "_users_guests WHERE g_user = " . $_GET['user'] . " AND g_guest = " . $user['user_id'] .
    5.             "", $_DB);
    6.         $rowUserGuests = mysql_fetch_array($resultUserGuests);
    7.         $howQueryMySQL = $howQueryMySQL + 1; // для статистики количества запросов в базу
    8.         if ($rowUserGuests['g_id']) {
    9.             $resultUserGuests = mysql_query("UPDATE " . $dbPrefix .
    10.                 "_users_guests SET g_date = NOW() WHERE g_id = '" . $rowUserGuests['g_id'] .
    11.                 "'", $_DB);
    12.             $howQueryMySQL = $howQueryMySQL + 1; // для статистики количества запросов в базу
    13.         } else {
    14.             $resultUserGuests = mysql_query("INSERT INTO " . $dbPrefix .
    15.                 "_users_guests (g_user, g_guest) VALUES ('" . $_GET['user'] . "','" . $user['user_id'] .
    16.                 "')", $_DB);
    17.             $howQueryMySQL = $howQueryMySQL + 1; // для статистики количества запросов в базу
    18.         }
    19.     }
    20.     // функция гостей профиля 
     
  2. ng0d

    ng0d Активный пользователь

    С нами с:
    7 фев 2009
    Сообщения:
    100
    Симпатии:
    0
    Адрес:
    Латвия
    Если в таблице users_guests есть запись где поле A = 1 и поле B = 2 то Update поля C иначе Insert в поля A и B. Как реализовать одним запросом? Спасибо.
     
  3. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    REPLACE ....
    INSERT ..... ON DUPLICATE KEY UPDATE ....
     
  4. ng0d

    ng0d Активный пользователь

    С нами с:
    7 фев 2009
    Сообщения:
    100
    Симпатии:
    0
    Адрес:
    Латвия
    Я не могу понять как составить запрос правильно, выше посмотрите что нужна выборка по двум полям и вставка от обновления отличаются по полям.
     
  5. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    REPLACE INTO TABLE (A,B,C) VALUES (1,2,3). Где A твой g_id
    ....
    INSERT INTO TABLE (A,B,C) VALUES (1,2,3) ON DUPLICATE KEY UPDATE g_date = NOW()
    ....

    Ну как-то так
     
  6. ng0d

    ng0d Активный пользователь

    С нами с:
    7 фев 2009
    Сообщения:
    100
    Симпатии:
    0
    Адрес:
    Латвия
    А как же условие WHERE g_user = " . $_GET['user'] . " AND g_guest = " . $user['user_id'] ?
     
  7. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    А сделать их UNIQUE напряг?
    Это даст сработать replace or duplicate
     
  8. ng0d

    ng0d Активный пользователь

    С нами с:
    7 фев 2009
    Сообщения:
    100
    Симпатии:
    0
    Адрес:
    Латвия
    $_GET['user'] - это номер гостя
    $user['user_id'] - это номер пользователя

    Записей несколько тысяч. Каким образом мне делать выборку записи?
     
  9. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    Сочетание пары: номер гостя и номер пользователя уникальны в таблице?
    Если сделать их уникальными то при insert (номер гостя, номер пользователя) сработает duplicate если пара уже есть
     
  10. ng0d

    ng0d Активный пользователь

    С нами с:
    7 фев 2009
    Сообщения:
    100
    Симпатии:
    0
    Адрес:
    Латвия
  11. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    Мне не интересен кусок вашей таблицы, я интересовался: пара (g_user, g_guest) уникальна во всех записях?

    Судя по куску : да. Вот и никто не мешает сделать эту пару уникальной и инсертить..
    Все зависит от ваших данных, мне они неведомы.
     
  12. ng0d

    ng0d Активный пользователь

    С нами с:
    7 фев 2009
    Сообщения:
    100
    Симпатии:
    0
    Адрес:
    Латвия
    Посмотрите выше код, не ужели не понятно.
    Входящие данные, это ид пользователей
    $_GET['user'] - это номер гостя
    $user['user_id'] - это номер пользователя
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    что-то ты намудрил.
     
  14. asokol

    asokol Активный пользователь

    С нами с:
    17 янв 2012
    Сообщения:
    162
    Симпатии:
    0
    ng0d, Вам говорят об индексе UNIQUE по этим полям.
    http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
    - в первых же строчках:
     
  15. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    Для примера возьмем кусок скриншота из таблицы (10 пост ng0d).
    На скриншоте первая строка
    Код (Text):
    1.  
    2. g_user: 17,
    3. g_guest: 1
    Например я беру и делаю ALTER TABLE TABLE ADD UNIQUE(g_user,g_guest)
    И если я попытаюсь сделать: INSERT INTO TABLE (g_user,g_guest) VALUES (17,1) то получу информацию о том, что подобная запись уже существует: Duplicate entry.
    Грубо говоря попыткой сделать INSERT ... ON DUPLICATE KEY UPDATE ... существующих данных, на основе уникального индекса двух полей, мы делаем SELECT UPDATE или INSERT одним запросом.
     
  16. ng0d

    ng0d Активный пользователь

    С нами с:
    7 фев 2009
    Сообщения:
    100
    Симпатии:
    0
    Адрес:
    Латвия
    Спасибо! Разобрался.