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

Помогите по MySQL


SLASH_id

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

$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 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
  • Спасибо (+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) во временную таблицу (список), затем удалить записи (можно и в таблице клиентов, и в таблице заказов), где клиент отсутствует во временной таблице.

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

 

 


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

На первый взгляд все ОК, но я бы использовал один раз 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
Ссылка на комментарий
Поделиться на другие сайты

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

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

 

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

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

  • 2 weeks later...

КОД:

http://pastebin.com/qPdz3kXD

 

 

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

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

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

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

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

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

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



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

    • Alex161
      От Alex161
      Что ж, скачал игру, поймал постоянную работу вентилятора и нагрузку, удалял, лечил, что только не делал все бестолку, после перезагрузки снова появляется...мучаюсь вторые сутки, умоляю, помогите
      avz_log.txt
    • lion6705
      От lion6705
      Столкнулся с проблемой в виде замедления работы пк и замедление работы интернета так же иногда пк выключался в любой момент для решения проблемы решил использовать dr.web curelt появился файл с отметкой dialer.exe и надписью угроза NET:MALWARE.URL если бы он сразу удалился не начал искать способы убрать его в ручную но спустя 2 повторных проверки один и тот же исход а именно при устранение угрозы произошла ошибка
      Полез искать решение на ютубе и нашёл советовали использовать frst для того чтобы избавиться от любого вируса и вроде бы всё сделал но появилась новая проблема когда я попытался нажать исправить мне написалась что файла fixlist нету хотя я вроде бы (возможно не так) поэтому я пишу это сообщение чтобы узнать верно ли я всё сделал и те ли файлы пометил чтобы исправить их и избавиться от вируса 




      fixlist.txt.txt
      Addition_05-01-2025 20.19.18.txtFRST_05-01-2025 20.14.51.txt
       
       
      fixlist.txt.txt
    • Zakhar62668
      От Zakhar62668
      Виндоус дефендер находит постоянно трояны, но удалить не может, также пытался установить разные антивирусы, но все они не запускаются, вылетают ошибки, а также в исключениях есть файлы, которые не удаляются. Сейчас, посмотрев форум, запустил компьютер в безопасном режиме и через флешку установил фарбар рекавери скан тулс(чтоб запустить его пришлось удалить ограничения в редакторе реестра)
    • Эльнар
      От Эльнар
      Здравствуйте! Помогите пожалуйста удалить вирус, скорее всего майнер. Он постоянно нагружает процессор, даже на рабочем столе. Как только открываю диспетчер задач, обороты вентиляторов процессора падают до нормального. Как только выхожу из диспетчера задач сразу обороты вентиляторов растут. При открытии диспетчера задач я не успеваю увидеть какой процесс нагружает компьютер. Эта проблема началась когда я установил программу видеомонтажа Magix Vegas Pro не с официального сайта. Так же из проблем не получается зайти в конфигурацию системы (msconfig), окошко сразу закрывается. При запуске антивируса Malwarebytes, он тоже сразу закрывается. Когда зашёл в систему через безопасную загрузку msconfig также не открывается, но удалось запустить malwarebytes и drweb, они нашли вирусы, но проблема не ушла. Запустил Kaspersky Removal Tool, он долго сканировал и нашёл вирусы. Один из них располагался в папке куда был установлен Magix Vegas Pro. После удаления вирусов ситуация к сожалению не изменилась. Приложил отчёт сборщика логов.
      CollectionLog-2024.12.02-15.07.zip
    • Alex2088
      От Alex2088
      Здравствуйте помогите расшифровать файлы бызы 1с. Сылку для скачиваия файла прикриплю.
        https://dropmefiles.com/f0l5Y 
      Frank_Help.txt
       
      Сообщение от модератора kmscom тема перемещена из раздела Компьютерная помощь
×
×
  • Создать...