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

Помогите по 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 недели спустя...

И еще раз спасибо, @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 недели спустя...

КОД:

http://pastebin.com/qPdz3kXD

 

 

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

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

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

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

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

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

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



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

    • darksimpson
      Автор darksimpson
      Добрый день.

      Помогите пожалуйста с определением зловреда и, возможно, с расшифровкой.

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

      Спасибо!
      p4.zip
    • Namido
      Автор Namido
      Уже два года как меня терроризирует непонятный майнер, никакие средства очистки не находят абсолютно ничего. Признаки: периодически как будто бы удаленный доступ к ноуту, открываются вкладки, курсор живет своей жизнью, нагружается процессор, иногда при заходе на любой сайт вылезает окно всплывающее "пароль" и "логин" с сылкой на сайт с казино(zagent?что-то такое). Сегодня совершенно случайно чистила ноут и увидела в логе строку"проверка пользователя John", загуглила, увидела, что проблема не новая.

      CollectionLog-2025.04.20-20.12.zip
    • qqjwjjj
      Автор qqjwjjj
      Когда я сегодня проснулся я увидел что у иконок на рабочем столе нет названий и через какое-то время они появились потом я увидел что с права снизу у меня нет времени и ещё когда я зашёл в проводник там всё было без названий и ещё у меня не работает кнопка пуск и поисковая строка и когда я пытался скачать dr web у меня выходила ошибка у меня сейчас 360 security я им сканировал на вирусы несколько раз и не чего не помогало перезагружал компьютер и не чего переустановить виндоус не могу флешки нету
    • ggruzin
      Автор ggruzin
      Здравствуйте, помогите удалить вирус авто кликcollectionLog.rarер. Не находится анти вирусами kaspersky free, malwarebytes , лечащей утилитой KVRT
      поймал на какой то копии сайта kinogo
      Заранее спасибо!
    • KNS
      Автор KNS
      Добрый день. Поймал шифровальщика, система и 99% данных восстановлены из бэкапа.
      Не хватает нескольких файлов.

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

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

      Заранее благодарю!
      123.zip
×
×
  • Создать...