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

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

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

Темный лес. Оставить чтоль ручками набранный массив. Работало ж оно как-то. 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

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

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



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

    • SMyDer
      Автор SMyDer
      Здравствуйте. При запуске инженерного ПО вылетала ошибка (см. картинку).
      Короче говоря, все свелось к тому, что был запущен .bat файл из корневой папки ПО, который выдал в консоли сообщение:
      ****ASSERTION****: Unknown error occured iterating C:\Windows\Fonts\Mysql
      Прошерстил темы на форумах по данному вопросу, но везде понял, что подход индивидуальный. Помогите, пожалуйста. Вот мой лог.

      CollectionLog-2025.05.30-04.47.zip
    • KNS
      Автор KNS
      Добрый день. Поймал шифровальщика, система и 99% данных восстановлены из бэкапа.
      Не хватает нескольких файлов.

      Помогите с расшифровкой.

      Прикрепляю пример зашифрованного файла и записку о выкупе.

      Заранее благодарю!
      123.zip
    • Alex161
      Автор Alex161
      Что ж, скачал игру, поймал постоянную работу вентилятора и нагрузку, удалял, лечил, что только не делал все бестолку, после перезагрузки снова появляется...мучаюсь вторые сутки, умоляю, помогите
      avz_log.txt
    • Tricky
      Автор Tricky
      У меня в диспетчере задач explorer.exe(Проводник) Сначало у меня на проводнике стояла картинка World of warships После удаления картинки с пк Explorer.exe стал полностью без иконки что делать
    • tubizzz
      Автор tubizzz
      Обнаружил что грузится процессор на 70% при запуске. Через процесс Хакер вижу два проводника. Один нормальный а второй как раз и грузит проц. Через доктор веб находит вирус этот, но не может вылечить, через процесс хакер его замораживать только могу. Читал на форуме про это и через прогу видит внедренный процесс
      \Net\9564\TCP\5.188.137.200-80\Device\HarddiskVolume5\Windows\explorer.exe
×
×
  • Создать...