Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Объеденение запросов

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
vova_klad
Отправлено: 26 Июня, 2016 - 16:10:17
Post Id


Новичок


Покинул форум
Сообщений всего: 18
Дата рег-ции: Июнь 2016  


Помог: 0 раз(а)




Привет всем! Помогите пожалуйста объеденить два запроса
CODE (html):
скопировать код в буфер обмена
  1. $query = "INSERT INTO `add`.`korzina`
  2. SELECT *
  3. FROM `add`.`new`
  4. WHERE  `number` = '".$_POST['number']."'

и
CODE (html):
скопировать код в буфер обмена
  1. DELETE FROM new WHERE `number` = '".$_POST['number']."';";
 
 Top
Мелкий Супермодератор
Отправлено: 26 Июня, 2016 - 16:16:40
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Судя по характерным символам ` - речь о mysql.
Невозможно. mysql так не умеет.


-----
PostgreSQL DBA
 
 Top
vova_klad
Отправлено: 26 Июня, 2016 - 16:18:10
Post Id


Новичок


Покинул форум
Сообщений всего: 18
Дата рег-ции: Июнь 2016  


Помог: 0 раз(а)




Ну а как сделать что бы после копирования в базу данных `korzina` удалялась та же запись только из базы данных `new`?
 
 Top
Почти_программист
Отправлено: 26 Июня, 2016 - 17:20:39
Post Id


Новичок


Покинул форум
Сообщений всего: 15
Дата рег-ции: Июнь 2016  


Помог: 0 раз(а)




vova_klad пишет:
Ну а как сделать что бы после копирования в базу данных `korzina` удалялась та же запись только из базы данных `new`?

у тебя ж запросы рабочие?
попробуй так:
1. Запускай запрос ИНЗЕРТ СЕЛЕКТ
2. Условие: если данный запрос выполнен, то пусть выполняется запрос DELETE

чем не вариант?

(Отредактировано автором: 26 Июня, 2016 - 17:27:04)

 
 Top
Мелкий Супермодератор
Отправлено: 26 Июня, 2016 - 19:51:33
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




У mysql такое как раз проблемно. Ни returning, ни writable cte, ни даже просто cte. Можно хранимку понаписать - но лучше не надо.

CODE (SQL):
скопировать код в буфер обмена
  1. begin;
  2. SELECT primary_key_field FROM tablename WHERE /**/ FOR UPDATE; -- вытягиваете на приложение
  3. INSERT INTO ... SELECT ... FROM tablename WHERE primary_key_field IN (...);
  4. DELETE FROM tablename WHERE primary_key_field IN (...);
  5. commit;

Вот так процедура переноса строк в mysql выглядит в транзакционном и конкурентно-безопасном виде.


-----
PostgreSQL DBA
 
 Top
LIME
Отправлено: 27 Июня, 2016 - 05:26:18
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




А может лучше объеденить не запросы а таблицы?
(Добавление)
В смысле не гонять туды сюда, а менять поле флаг? А то это при добавлении новых состояний не натаскаешься
 
 Top
Мелкий Супермодератор
Отправлено: 27 Июня, 2016 - 08:17:35
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Смотря для чего делается.

Обновить флаг и переместить запись в другую таблицу - задача эквивалентной сложности. update ведь не существует, есть только insert и delete. Но индексов больше обновить придётся. Выкидывать архивные данные, к которым обращения будут очень редки, в отдельную таблицу - мысль не самая плохая и помогает эффективнее использовать память и сильно уменьшить размеры индексов основной таблицы.
Ну а если данные не архивные - то да, смысла становится резко меньше.


-----
PostgreSQL DBA
 
 Top
LIME
Отправлено: 27 Июня, 2016 - 09:43:22
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Мелкий пишет:
update ведь не существует
это почему это?
Мелкий пишет:
Но индексов больше обновить придётся.
опять же почему? только индекс флага/с флагом
Мелкий пишет:
Выкидывать архивные данные, к которым обращения будут очень редки, в отдельную таблицу
горизонтальное партицирование, в мускуле из коробки без шаманств
 
 Top
Мелкий Супермодератор
Отправлено: 27 Июня, 2016 - 10:03:33
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




LIME пишет:
это почему это?

MVCC потому что.
update в mvcc делает следующее:
для актуальной строки выставляет максимальный идентификатор видимости в id текущей транзакции, создаёт новую копию этой строки, максимальный id транзакции не указан, а минимальный - текущая транзакция.
delete выставляет максимальный идентификатор видимости и не удаляет строку физически - она впоследствии может быть перезаписана чем-нибудь другим полезным, но не удалена. К слову, у mysql нет вакуума, так что вернуть занятое дисковой место операционной системе без даунтайма - задача нетривиальная.

LIME пишет:
опять же почему? только индекс флага/с флагом

С флагом - да, только индексы, в которые входит этот флаг.
С архивной или партицированной по этому флагу таблицей - надо будет перестроить все индексы. Поэтому и нужно обновить больше индексов. Вроде логично?

Да, можно партицировать. Придётся отказаться от FK, зато становится куда проще делать смешанные запросы, и к архивной и к активной частям.


-----
PostgreSQL DBA
 
 Top
LIME
Отправлено: 27 Июня, 2016 - 10:22:36
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




MVCC еще от политики зависит
я даже не помню какие они там бывают прочел и забыл) или это о транзакции...сутки не спал память отказывает напрочь)
дык в том и дело что при простой смене флага можно одним апдейтом обойтись(запросом)
тоись не городить транзакции более одного запроса
Мелкий пишет:
партицированной по этому флагу таблицей
ктож архивные таблицы партицирует по флагу состояния
по дате скорее уж
флаг отдельным индексом или вкупе с каким не учавствующим в партицировании
при переносе также индексы перестроются...в обеих таблицах....все...кроме одного флага в случае отдельного индекса
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB