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

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

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

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



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

    • tubizzz
      От tubizzz
      Обнаружил что грузится процессор на 70% при запуске. Через процесс Хакер вижу два проводника. Один нормальный а второй как раз и грузит проц. Через доктор веб находит вирус этот, но не может вылечить, через процесс хакер его замораживать только могу. Читал на форуме про это и через прогу видит внедренный процесс
      \Net\9564\TCP\5.188.137.200-80\Device\HarddiskVolume5\Windows\explorer.exe
    • RusLine
      От RusLine
      Здравствуйте помогите чем сможете. Скачал с nnmclub total commander попользовался а утром зашифровало все фото файлы важные. Подскажите что делать ?
        



    • Шаманов_Артём
      От Шаманов_Артём
      Доброго дня. Поймали данный шедевр на компы, подскажите пожалуйста, какие действия предпринимать, куда бежать, куда писать?
       
      Сообщение от модератора thyrex Перенесено из данной темы
    • Poiluyf
      От Poiluyf
      Доброе утро вчера скачал обход для дискорда и цепанул эту заразу. Причём один комп вроде не заразился а вот ноутбуку досталось. Файл dwm.exe. 
      отчет.txt
      Нашёл файл удалить не возможно грузит процессор.
    • unfamous1337
      От unfamous1337
      Сегодня решил запустить пк и поиграть в доту и увидел что фпс просто ужасный хотя пк более менее для нее подходящий 
      Гуглил и нашел в пользователях имя John или как то так не помню Удалил его 
      Файла hosts нет на сайты зайти не могу с антивирусами а если и могу то файлы не запускаются пробовал приложения скачать по типу AVZ Не запускаются 
      Помогите 
×
×
  • Создать...