2010-11-15 5 views
3

У меня есть две таблицы. Одна таблица предназначена как история транзакций, а другая - журнал деталей участника. Когда отчет запускается, я хочу переместить части деталей участника в историю транзакций, но ТАКЖЕ обновлять некоторые записи полей, которые иначе не существовали бы.Можно ли вставлять значения из одной таблицы в другую И обновлять значения полей в одном запросе?

Можно ли выбрать все записи, которые отвечают определенным критериям, вставить только части соответствующей строки в другую таблицу И обновить другие поля в одном запросе?

Например:

В таблице 2, у меня есть имя члена, дата регистрации, и MemberId. Я хочу переместить вышеуказанные записи в таблицу 1, но также обновить поле (статус), равное «обработанному».

Примечание: Я также использую php и pdo для подключения к базе данных mysql.

Возможно ли это в рамках одного запроса?

+0

Почему вы хотите сделать это в одном запросе? Почему бы не обойти два запроса в [транзакции] (http://dev.mysql.com/doc/refman/5.0/en/commit.html)? – ircmaxell

+0

хорошая точка - чем больше я думаю о том, тем более бесполезным кажется один запрос ... – JM4

+1

Два читаемых, эффективных запроса лучше, чем один большой запутанный запрос в любой день недели. Как с точки зрения семантики, так и с точки зрения производительности. Не попадайте в ловушку меньше, всегда лучше (есть, конечно, компромиссы, но это не универсальная правда) ... – ircmaxell

ответ

1

После долгих размышлений - я решил использовать ircmaxell в совет и просто запустить несколько запросов. Это не только упрощает работу, но и позволяет мне значительно упростить сортировку.

Как он сказал выше, «Не попадайте в ловушку менее всегда лучше»

1

Вы не указали, совпадают ли строки, которые вы хотите обновить, с теми, которые вы вставляете. Я предполагаю, что они:

insert into table1 
(member_name, date_registered, memberid, status) 
select member_name, date_registered, memberid, 'processed' 
from table2 
where SomeField = MyCriteria 
+0

Проблема заключается в том, что im использует подготовленные инструкции и pdo, поэтому, когда я пытаюсь запустить код. .. "select member_name, date_registered, memberid, SET status =? ..." он дает ошибки. – JM4

0

Да:

SELECT *, "processed" INTO table2 FROM table1 

Вам придется адаптироваться на основе структуры таблицы, возможно, даже писать все поля:

SELECT field1, field2, field3, "processed" INTO table2 FROM table1 

отметить , предполагается, что вы хотите записать в таблицу 2 , включая обработанную переменную (могу ли я предложить логическое?), если вы хотите, чтобы «обработанный» в другой таблице получал больше compli лаборант.

Edit: Видимо MySQL не поддерживает выбор в так ...

INSERT INTO table2 SELECT field1, field2, field3, "processed" FROM table1 

Redfilters код работает

+0

@JV - основная проблема - это предложение подготовленного оператора, я могу просто запустить два запроса, если это необходимо, потому что мне нужно запустить инструкцию выше в цикле на основе возвращаемого результата независимо (здесь будет много вводов). – JM4

Смежные вопросы