Как выполнить операцию вставки и выбора одновременно в одной таблице в запросе MySQL?

В моей базе данных есть таблица под названием questions. Для справки я привожу ниже структуру таблицы 'questions':

question_id                   bigint(12) AUTO_INCREMENT (Primary Key)
question_parent_id            bigint(12)
question_subject_id           smallint(11)
question_topic_id             int(11)
question_directions           text
question_text                 text
question_file                 varchar(100)
question_description          text
question_difficulty_type      tinyint(4)
question_has_sub_ques         enum('0', '1')
question_picked_individually  enum('no', 'yes')
question_appeared_count       bigint(12)
question_manual               enum('0', '1')
question_site_id              varchar(10)
question_created_staff_id     varchar(32)
question_added_date           bigint(12)
question_updated_staff_id     varchar(32)
question_updated_date         bigint(12)

Эта таблица содержит тысячи вопросов. Теперь сценарий: я беру несколько значений из формы PHP следующим образом:

/*Following are the subject id and topic id from which I want to fetch the questions belonging to that subjet id and topic id */    
    $_POST['from_subject_id'] => 8
    $_POST['from_topic_id'] => 545
/*Following are the subject id and topic id to which I want to add the questions fetched in above query*/
    $_POST['to_subject_id'] => 8
    $_POST['to_topic_id'] => 547

Итак, я хочу добавить вопросы, полученные на основе первых двух значений subject_id и theme_id(i.e. based on $_POST['from_subject_id'] and $_POST['from_topic_id']), в одну и ту же таблицу. Но все эти вновь вставленные вопросы должны иметь значения subject_id и theme_id, указанные после следующего комментария (i.e. $_POST['to_subject_id'] and $_POST['to_topic_id']). Короче говоря, я хочу одновременно выполнять операции вставки и выбора в одной таблице. Для достижения этого я перепробовал множество трюков, а также поискал решение в Google, но не смог найти идеальное решение. Может ли кто-нибудь помочь мне в этом отношении? Я попытался со следующим SQL-запросом, но он вставляет те же вопросы со значениями идентификатора темы и темы, которые у них уже есть. Короче говоря, вопросы повторяются, и я не хочу такого результата. Вместо этого я хочу, чтобы одни и те же вопросы были вставлены с новым идентификатором темы и новым идентификатором темы. Для справки я привожу ниже SQL-запрос:

INSERT INTO questions (question_parent_id, question_subject_id, question_topic_id, question_directions, question_text, question_file, question_description, question_difficulty_type, question_has_sub_ques, question_picked_individually, question_manual, question_site_id, question_created_staff_id, question_added_date, question_appeared_count, question_updated_staff_id, question_updated_date)
SELECT question_parent_id, question_directions, question_text, question_file, question_description, question_difficulty_type, question_has_sub_ques, question_picked_individually, question_manual, question_site_id, question_created_staff_id, question_added_date, question_appeared_count, question_updated_staff_id, question_updated_date
FROM questions
WHERE question_subject_id='8' AND question_topic_id='545'

Большое спасибо за


person PHPLover    schedule 26.12.2013    source источник


Ответы (2)


Подставьте нужные значения в часть select запроса:

INSERT INTO questions (question_parent_id, question_subject_id, question_topic_id, question_directions, question_text, question_file, question_description, question_difficulty_type, question_has_sub_ques, question_picked_individually, question_manual, question_site_id, question_created_staff_id, question_added_date, question_appeared_count, question_updated_staff_id, question_updated_date)
    SELECT question_parent_id,  8, 547,
           question_directions, question_text, question_file,
           question_description, question_difficulty_type, question_has_sub_ques,
           question_picked_individually, question_manual, question_site_id,
           question_created_staff_id, question_added_date, question_appeared_count,
           question_updated_staff_id, question_updated_date
FROM questions
WHERE question_subject_id = '8' AND question_topic_id = '545';

Или может начаться select:

select question_parent_id, $_POST['to_subject_id'], $_POST['to_topic_id']
person Gordon Linoff    schedule 26.12.2013
comment
+1 Я довольно часто использую этот шаблон для копирования данных из одного родительского идентификатора в другой. - person Erick Robertson; 26.12.2013

Я не уверен, что понимаю ваш вопрос. Вы хотите добавить новые записи в ту же таблицу, но изменить id темы с 545 на 547? Если это все, что вам нужно, будет работать следующее:

INSERT INTO questions 
SELECT 
    question_id ,
    question_parent_id ,
    question_subject_id + 1 ,
    547 ,
    question_directions ,
    question_text   ,
    question_file   ,
    question_description    ,
    question_difficulty_type    ,
    question_has_sub_ques   ,
    question_picked_individually    ,
    question_appeared_count ,
    question_manual ,
    question_site_id    ,
    question_created_staff_id   ,
    question_added_date ,
    question_updated_staff_id   ,
    question_updated_date   
FROM questions
WHERE question_subject_id=8 AND question_topic_id=545;

Некоторые вопросы для дальнейшего уточнения: есть ли какая-то связь между недавно вставленным question_parent_id и question_id существующей строки? Или новая строка просто наследует старые значения question_id и question_parent_id?

Вы говорите, что хотите «новый» идентификатор субъекта, но не указываете, каким он должен быть. Я просто увеличил идентификатор субъекта из существующей строки, добавив к нему 1. Если вы хотите что-то еще, пожалуйста, укажите. В вашем примере из PHP кажется, что должно остаться 8. В этом случае удалите +1 из моего кода выше.

person user3133172    schedule 26.12.2013