За последние 24 часа нас посетили 22372 программиста и 996 роботов. Сейчас ищут 659 программистов ...

обновить 15 000 строк MySQL PHP

Тема в разделе "PHP и базы данных", создана пользователем frixer, 14 окт 2019.

  1. frixer

    frixer Новичок

    С нами с:
    14 окт 2019
    Сообщения:
    7
    Симпатии:
    0
    Не могу понять что и как сделать.
    необходимо обновить значения одной таблице по условию (название столбца) условие и значение получаю с другой таблице или при чтении xml файла.
    помогите пожалуйста 5 день ломаю голову и циклами и массивами 504 и все

    Код (Text):
    1. $xml = simplexml_load_file("1.xml");
    2.     $num=0;
    3.     foreach($xml->ПакетПредложений->Предложения->Предложение as $item){
    4.      
    5.         $var = $item->Количество;
    6.         $var2 = $item->Артикул;
    7.         $query ="UPDATE items SET rest = '".$var."' WHERE field_217 = '".$var2."'";
    8.    
    9.         $result = mysqli_query($link, $query) or die("Ошибка 2" . mysqli_error($link));
    10.  
    11.     }
    12.  
    13. mysqli_close($link);
    На этом я остановился...
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    увеличивайте ресурсы сервера, + пересматривайте структуру БД
     
  3. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @frixer, возьми за правило. Если ты делаешь запрос в цикле - ты делаешь неправильно.
    1 MySQL позволяет произвести загрузку из CSV файла одной командой. Погугли.
    2 Если это временная таблица никто не запрещает грузить в оперативную память (если конечно позволяет объём) где ей самое место. Погугли.
    3 Никто не запрещает использовать JOIN в команде UPDATE и обновлять таблицы в зависимости от их значений. Погугли.
     
  4. Roman __construct

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

    С нами с:
    27 апр 2019
    Сообщения:
    1.270
    Симпатии:
    112
    использование XML нужно законодательно запретить :D

    а вообще, если сервак захлебывается из-за размера файла с xml то можно

    - попытаться использовать вместо simplexml какие-то менее прожорливые аналоги
    - читать из файла построчно и разбирать его руками
    - перевести XML сначала целиком в БД, а уже потом просто работать с двумя БД (я бы наверное попытался сделать именно так)

    в общем, много чего можно придумать при нехватке памяти :))
     
  5. frixer

    frixer Новичок

    С нами с:
    14 окт 2019
    Сообщения:
    7
    Симпатии:
    0
    да с xml проблемы залит в БД нет, все отрабатывает на ура, во временную таблицу. но потом получается надо взять одно значение из одной таблицы зайти в другую посмотреть есть ли там такой артикул если есть заменить rest, потом берем второй третий и так 15000 строк
    --- Добавлено ---
    и вот тут у меня ступор, либо забираеть опять все в массив либо циклично брать проверять брать проверять
     
  6. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    Обратите внимание на пункт 3 сообщения #3 :)
     
    Roman __construct нравится это.
  7. frixer

    frixer Новичок

    С нами с:
    14 окт 2019
    Сообщения:
    7
    Симпатии:
    0
    сижу разбираюсь, с update не сталкивался в связке с Join
     
  8. frixer

    frixer Новичок

    С нами с:
    14 окт 2019
    Сообщения:
    7
    Симпатии:
    0
    Что то не то, вообщем пробовал с левт и просто

    Код (Text):
    1. UPDATE items, ta  SET items.rest = ta.ostatok WHERE items.custom_7 = ta.articul
    504 вылетает

    max_execution_time= 600 пробовал и 3000 ставить бесполезно
    подскажите как поступить еще
     
  9. Roman __construct

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

    С нами с:
    27 апр 2019
    Сообщения:
    1.270
    Симпатии:
    112
    Говоря честно - я читаю читаю и никак не могу ухватить суть проблемы (ну я не оч сообразительный насчет БД, да))))

    1. Трансформировали XML в SQL-базу - так? Успешно? Ок.
    2. "надо взять одно значение из одной таблицы" - тоже не проблема, как я понимаю, да?
    3. "зайти в другую посмотреть есть ли там такой артикул" - это тоже возможно?
    4. "если есть заменить rest" - это можно да?
    5. "потом берем второй третий и так 15000 строк" - и это?

    Ну?

    "либо циклично брать проверять брать проверять" - а почему бы и нет?

    Если столько мороки - ну сделай скрипт который сделает 15000 итераций, да и всё.

    Кстати, такие вещи вообще лучше делать из PHP-CLI.

    А то из сабжа вообще ничего непонятно, ни среда исполнения, нихрена))))))))
     
  10. frixer

    frixer Новичок

    С нами с:
    14 окт 2019
    Сообщения:
    7
    Симпатии:
    0
    1. да успех
    2. -3 -4 5 это я так предполагаю один запрос делать должен но он висит.
    циклично можно пример типа цикла for не понимаю.... ааааа, может глубоко сам копаю а все как обычно на поверхности....

    суть такова что есть две таблицы в одной БД, нужно поочередно взять первое значение во второй таблице, по артикулу найти эту строку в первой таблице, и заменить поле rest в первой таблице значением из второй, и так все строки.
     
  11. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    Есть такая вещь как триггеры. Может вам поможет? Так как обновление будет происходить параллельно изменениям в первой таблице. Не 15 тыщ одновременно. И php вообще не нужен... Запустил триггер и все...
     
  12. frixer

    frixer Новичок

    С нами с:
    14 окт 2019
    Сообщения:
    7
    Симпатии:
    0
    нет не приходилось работать
     
  13. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    За такие советы надо гнать с форума пинками...
    Код (Text):
    1. UPDATE
    2.      items
    3.        LEFT JOIN ta ON  items.custom_7 = ta.articul
    4.   SET items.rest = ta.ostatok
     
  14. Roman __construct

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

    С нами с:
    27 апр 2019
    Сообщения:
    1.270
    Симпатии:
    112
    Это уже из раздела
    Digging Deeper :D
    --- Добавлено ---
    ...товарищи, зарядка окончена, переходим к хранимым процедурам...
    ))
     
  15. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @frixer, точнее там скорее всего RIGHT JOIN
     
  16. frixer

    frixer Новичок

    С нами с:
    14 окт 2019
    Сообщения:
    7
    Симпатии:
    0
    спасибо большое сделал только без left быстрее отрабатывает,
     
  17. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @frixer, дело не в быстрее, а в корректности выборки.