Скопируйте таблицу MySQL и заполните дополнительные поля - PullRequest
1 голос
/ 30 мая 2011

Я хочу скопировать существующую таблицу MySQL в дубликат таблицы, но с двумя дополнительными полями, заполненными данными, полученными из других запросов.Это программное обеспечение для форумов, которое никогда не фиксировало первоначальную дату создания темы (оно всегда переписывало время с самым последним ответом).

Итак, я хочу взять существующую таблицу 'threads'

thread_id
thread_author
thread_subject
thread_last_reply_date

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

thread_id
thread_author
thread_subject 
thread_last_reply_date 
thread_creation_date
thread_last_poster_id 

И thread_last_reply_date, и thread_last_poster_id могут быть заполнены из зависимых запросов. Например, last_poster_id с запросом:

SELECT post_author FROM posts WHERE thread_id = ? AND post_date = thread_last_reply_date

И для thread_creation_date:

SELECT MIN(post_date) FROM posts WHERE thread_id = ?

По сути, это процесс, который я бы сделал со сценарием PHP. Последовательность SELECT, а затем вставка записей по одной.Любые советы или указания о том, как выполнить этот тип процесса в чистом SQL, были бы безумно полезными (если это возможно).

РЕДАКТИРОВАТЬ: пример техники был бы полезен.Мне не нужен точный ответ на вышесказанное.Я уверен, что у всех есть дела поважнее.

Ответы [ 2 ]

2 голосов
/ 02 июля 2011

Просто была похожая проблема.

Это решение сработало для меня:

INSERT INTO `new_thread` SELECT *,null,null FROM `thread` WHERE 1=1
0 голосов
/ 30 мая 2011

Для создания целевой таблицы (пусто):

CREATE TABLE new_threads 
SELECT t.*, thread_creation_date date, thread_last_poster_id number 
FROM thread where 1=0;

и для ее заполнения:

insert into new_threads(thread_id, thread_author, thread_subject, thread_last_reply_date, thread_creation_date, thread_last_poster_id)
(select t.*, 
  min(p.post_date), 
  (SELECT p1.post_author 
   FROM posts p1 
   WHERE p1.thread_id = t.thread_id 
   AND p1.post_date = t.thread_last_reply_date) thread_last_poster_id
  from threads t, posts p
  where t.thread_id = p.thread_id;

(не проверено)

...