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

Помогите по MySQL


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

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


Ссылка на сообщение
Поделиться на другие сайты
  • Ответов 31
  • Created
  • Последний ответ

Top Posters In This Topic

  • SLASH_id

    19

  • ACIK

    9

  • Skarbovoy

    4

Top Posters In This Topic

Popular Posts

UPDATE clients SET fio = '<del>', company = '<del>, phone = '<del>, adress = '<del>' WHERE city_id = 1090

SELECT O . * , O.nakladnaya AS 'number', O.status AS 'status', O.date_receive AS 'date', OA.who_get 'who', C_from.name AS 'from_city', C_to.name AS 'to_city', OA. * , OP. *, C_time_dst.time_dst

CONCAT - Возвращает строку, являющуюся результатом конкатенации аргументов. Др. словами - сложение строк. IF - оператор условия. Если comment - пустая строка (значение), то вернет пустую строку, есл

Posted Images

$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
Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

 

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

Ссылка на сообщение
Поделиться на другие сайты
  • 2 weeks later...

И еще раз спасибо, @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
Ссылка на сообщение
Поделиться на другие сайты

Отлично.

 

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

Таблицы: 

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
)
Ссылка на сообщение
Поделиться на другие сайты

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

Ссылка на сообщение
Поделиться на другие сайты
  • 2 weeks later...

КОД:

http://pastebin.com/qPdz3kXD

 

 

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

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

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

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

Изменено пользователем SLASH_id
Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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

    • Иван_Холодов
      От Иван_Холодов
      Недавно словил удалённый доступ 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.

×
×
  • Создать...