Перейти к содержанию

Рекомендуемые сообщения

Опубликовано

Темный лес. Оставить чтоль ручками набранный массив. Работало ж оно как-то. PHP это не моё...


Опубликовано (изменено)

$result = mysql_query("запрос...........");

 

//страховка от некорректного запроса

if (!$result) {

echo 'Ошибка запроса: ' . mysql_error();

exit;

}

 

//создаем пустой массив

$arr_id = array();

 

//цикл - перебор строк запроса

while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {

$arr_id[] = $row['city_id'];

}

 

//очистка памяти

mysql_free_result($result);

Добавлю

http://php.net/manual/ru/function.mysql-fetch-array.php

предупреждают об удалении этих функций в PHP 5.5

 

В новой версии PHP добавили mysqli_fetch_all() - возвращает весь массив (цикл уже не нужен).

Вот на Хабре об этом:

http://habrahabr.ru/post/154663/

 

Так что, думаю, сперва бы посмотреть на версию своего PHP.

Изменено пользователем ACIK
  • Спасибо (+1) 1
  • Согласен 1
Опубликовано

Хм, гм. Ну точно темный лес.

 

Завтра попробую внедрить сей код в продакшн.

Поскольку стенда нет физически - внедрять буду наживую прямо в процесе работы в разгар рабочего дня.

 

@ACIK, Премного благодарен за помощь! 

  • 2 недели спустя...
Опубликовано (изменено)

И еще раз спасибо, @ACIK. Очень пригодилось. Во многих местах переписал реализацию.

 

Итак. Дано:

 

Три таблицы.

orders
orders_additional
orders_pay

 

В каждой по много полей.

 

У каждой таблицы есть одинаковое поле их связывающее. (o_id)

 

В таблицу orders в поле date_sent пишется время в unixtimestamp.

 

 

Задача:

Удалить из всех трех таблиц записи где date_sent < определенного.

 

Как?


DELETE orders, orders_additional, orders_pay FROM orders
LEFT JOIN orders_additional ON orders_additional.o_id = orders.o_id
LEFT JOIN orders_pay ON orders_pay.o_id = orders.o_id
Where orders.date_sent < 123456

Так? 

Изменено пользователем SLASH_id
Опубликовано

 

 


Как?

По моему как то так:

begin transaction
delete from orders_pay where orders_pay.o_id in (select orders.o_id from orders where orders.date_sent < 123456)
go
delete from orders_additional where orders_additional.o_id in (select orders.o_id from orders where orders.date_sent < 123456)
go
delete  from orders where orders.date_sent < 123456
go
commit transaction
  • Спасибо (+1) 1
  • Согласен 1
Опубликовано (изменено)

Отлично.

 

Теперь еще интересней.

Таблицы: 

orders
orders_pay

clients

 

В таблице  orders как и говорил раньше есть unixtimestamp, а так же столбцы sender_id и receiver_id.

В таблице orders_pay имеется поле who_id

В таблице clients есть поле client_id

 

Задача:

 

Сделать выборку orders_pay.who_id и orders.sender_id и orders.receiver_id где orders.unixtimestamp < 1234567

И удалить всех из таблицы clients,  client_id которых не попал в выборку.

 

Простыми словами:

Есть заказы с датой в orders и указание кто заказывал (sender_id), кто принимал (receiver_id) и кто платит - (id клиента) в orders_pay.

Требуется удалить всех клиентов,  id которых не фигурировал ни в одном из этих полей с 2011 года.

 

Реально мозг сломан. Я такой сверхзапрос сам точно не напишу.


Пока вышло как-то так....

DELETE 
FROM  `clients`
WHERE  `client_id` NOT
IN (

SELECT  `sender_id`
FROM  `orders`
WHERE  `date_sent` >1325376000
)
AND  `client_id` NOT
IN (

SELECT  `receiver_id`
FROM  `orders`
WHERE  `date_sent` >1325376000
)
AND  `client_id` NOT
IN (

SELECT who_id
FROM orders_pay
LEFT JOIN orders ON orders_pay.nakladnaya_id = orders.nakladnaya
WHERE orders.date_sent >1325376000
)
Изменено пользователем SLASH_id
Опубликовано

ни в одном из этих полей с 2011 года.

А заказы останутся до 2011 года? Их удалять будете?

 

Я о том, не боитесь ли нарушить целостность базы, удалив клиентов?

Опубликовано

Точные даты до которых удалять сейчас уточняются. Скорей всего удалять буду и клиентов и заказы до одной даты.

Но даже если нет - данные выводятся в веб интерфейс. Посему если что - получим в полях null

Опубликовано

А клиентов много за 4 года?

Если нет, могу предложить вариант: выбрать всех клиентов (их id) за 4 года (2011-14) во временную таблицу (список), затем удалить записи (можно и в таблице клиентов, и в таблице заказов), где клиент отсутствует во временной таблице.

Опубликовано

Более 350 000.

 

Чем плох тот запрос который я написал? Что там не так?

Есть какие-то проблемы?

Опубликовано

 

 


Чем плох тот запрос который я написал? Что там не так?

На первый взгляд все ОК, но я бы использовал один раз NOT IN, а в подзапросе UNION.

DELETE 
FROM  `clients`
WHERE  `client_id` NOT
IN (

SELECT  `sender_id`
FROM  `orders`
WHERE  `date_sent` >1325376000

UNION

SELECT  `receiver_id`
FROM  `orders`
WHERE  `date_sent` >1325376000

UNION

SELECT who_id
FROM orders_pay
LEFT JOIN orders ON orders_pay.nakladnaya_id = orders.nakladnaya
WHERE orders.date_sent >1325376000
)
  • Спасибо (+1) 1
  • Согласен 1
Опубликовано

@Skarbovoy, Я до оператора  UNION еще не добрался в освоении мускуля. Спасибо. буду знать что так можно.

Опубликовано

Есть какие-то проблемы?

Все зависит от задачи и данных. Я сейчас об оптимизации запросов.

 

Но если это на 1 раз, то нет смысла в "вылизывании кода".

Опубликовано

Предположительно на раз в год.

 

По итогам, запрос выполнился за 15 секунд)

322000+ клиентов убил.

  • 2 недели спустя...
Опубликовано (изменено)

КОД:

http://pastebin.com/qPdz3kXD

 

 

В указанных местах не отрабатывает сравнение с $res_test['predstav_receive_id']

Запрос. Результат в массив. Потом условие на наличия данных в массиве (count) и сравнение элемента массива с $_SESSION['auth']['predstav_id']

Полагаю что я что-то делаю не так.
Сравнивать с элементами массива нельзя? Или что не так?

Как правильно?

Изменено пользователем SLASH_id

Пожалуйста, войдите, чтобы комментировать

Вы сможете оставить комментарий после входа в



Войти
  • Похожий контент

    • Иван_Холодов
      Автор Иван_Холодов
      Недавно словил удалённый доступ John (rms) и майнер Mysql, всё почистил, кроме папок с следами от майнеров и удалённых доступов. Папки в проводнике скрыты, а в cmd не даёт удалить-пишет "Отказано в доступе" (картинка 1). Также невозможно установить Rogue killer, HitmanPro, Malwarebytes (картинка 2). В прошлой винде создавал нового пользователя с правами администратора и там всё проворачивал. После этого отказал Microsoft store и все приложения из него, а также настройки багались при переходе на вкладку "Дисплей" в "Системе". В новой винде страшно создавать нового пользователя. Как мне вернуть права администратора без переустановки?


    • SnakeEyes
      Автор SnakeEyes
      MySQL 8.0, работающий с Касперским создаёт ежедневно логи весом в 1гб, поддержка сказала что у нас происходит запись в эти логи практически каждого шороха. Вопрос в том, что мне поменять в прикреплённом файле чтобы у меня логи хранились неделю и записывались туда только важные или критические изменения.
      Новый текстовый документ.txt
    • Troki
      Автор Troki
      Здравствуйте! Возникла проблема такого рода, в браузере Microsoft Edge открываются сами по себе вкладки с рекламой, прости господи, с порно, открывается паблик в вк и всякие разные ставки, даже если браузер закрыт, он открывается из за какого нибудь сайта. Касперский вылечил и удалил несколько вирусов, но проблема не исчезла, на форумах я нашла приложение RogueKiller, скачала и провела сканирование, который показал наличие нескольких угроз, а именно: Mysql в папке Fonts, puzzleMedia в ProgramData, были еще несколько которые получилось удалить нехитрым способом через unlocker
      Так же хочу заметить что у меня был какой то пользователь с правами администратора, я его так же удалила, не знаю, вернется он или нет, но вроде пока его нет

    • GreyCats
      Автор GreyCats
      Здравствуйте! При включении компьютера произвольно открывается основной браузер (в моём случае Opera) с новой рандомной вкладкой, от безобидной рекламы до сайтов-вымогателей и порно. Не уверен, есть ли тут прямая связь, но при работе с браузером иногда выключается монитор и зависает компьютер. Хотя при работе с видеоредактором или в играх такой проблемы нет. Сканирование на вирусы выявило несколько нежелательных элементов, от одного из которых - mysql в папке fonts - так просто не избавиться. Прикрепляю логи (не знаю, насколько это критично, но я ошибся и второй раз запустил тот же Avbr после первой проверки, так что прикрепил оба)
      AV_block_remove_2022.12.02-18.04.log CollectionLog-2022.12.02-18.23.zip AV_block_remove_2022.12.02-18.12.log
    • puruzento
      Автор puruzento
      Добрый день! Вас беспокоят с АО "НЦВ Миль и Камов", нам пришла сегодня новая лицензия на Касперский, но мы также решили поменять (сделали новый с нуля) сервер для АВ, вместо SQL Express, который не устраивал нас по размерам БД, поставили MySQL 5.7 на CentOS 8. При попытке добавить лицензию происходит следующая ошибка:
      Ошибка времени выполнения: Database error occured: #1950 (1366) Generic db error: "1366, 'Incorrect string value: '\xD0\x90\xD0\xBA\xD1\x81...' for column '__vtmp_wstrPartnerName' at row 1' , LastStatement='SET @arg31 = NULL; SET @arg32 = NULL; SET @arg33 = NULL; CALL licsrv_install_key(0, 1017, 'XXX-XXXXXX-XXXXXXXX', _utf8'Kaspersky Endpoint Security для бизнеса – Расширенный Russian Edition. 5000+ Node 3 year Renewal License: Security Center', 3650, 1009, 1, 0, '',
       
      Судя по моим поискам в Интеренете, это может быть связано с кодировкой, поэтому, я везде, поставил расширенную версию UTF (раньше стояло UTF8).
      Параметры MySQL
      mysql> SHOW VARIABLES LIKE "coll%";
      +----------------------+--------------------+
      | Variable_name        | Value              |
      +----------------------+--------------------+
      | collation_connection | utf8mb4_general_ci |
      | collation_database   | utf8mb4_unicode_ci |
      | collation_server     | utf8mb4_general_ci |
      +----------------------+--------------------+
      mysql> SHOW VARIABLES LIKE "charac%";
      +--------------------------+----------------------------+
      | Variable_name            | Value                      |
      +--------------------------+----------------------------+
      | character_set_client     | utf8mb4                    |
      | character_set_connection | utf8mb4                    |
      | character_set_database   | utf8mb4                    |
      | character_set_filesystem | binary                     |
      | character_set_results    | utf8mb4                    |
      | character_set_server     | utf8mb4                    |
      | character_set_system     | utf8                       |
      | character_sets_dir       | /usr/share/mysql/charsets/ |
      +--------------------------+----------------------------+
      Сам параматер wstrpartnerName найден мной в таблице v_lickey, его параметры
      | wstrPartnerName        | varchar(256) | ucs2_general_ci  | YES  |     | NULL   
       
      CNF файл:
      [client]
      default-character-set = utf8mb4
      [mysqld]
      join_buffer_size = 20M
      sort_buffer_size = 10M
      tmp_table_size = 200M
      max_heap_table_size = 200M
      key_buffer_size = 200M
      innodb_buffer_pool_size = 80G
      innodb_thread_concurrency = 20
      innodb_flush_log_at_trx_commit = 0
      innodb_lock_wait_timeout = 300
      max_allowed_packet = 32M
      max_connections = 151
      character_set_server = utf8mb4
      # read_rnd_buffer_size = 2M
      datadir=/var/lib/mysql
      socket=/var/lib/mysql/mysql.sock
      init_connect = 'SET NAMES utf8mb4'
      #default-character-set = utf8mb4
      # Disabling symbolic-links is recommended to prevent assorted security risks
      symbolic-links=0
      log-error=/var/log/mysqld.log
      pid-file=/var/run/mysqld/mysqld.pid
       
      Ошибка остается, нужна помощь.
       
      Версия центр администрирования 13.1.0.8324, MS Windows Server 2016.
×
×
  • Создать...