MySQL: как извлечь данные из двух таблиц и сохранить в одной таблице - PullRequest
0 голосов
/ 06 июля 2011

У меня три табл.2 данные берутся из 2 таблиц и вставляют их в другую таблицу.Пусть: tbl_id содержит поле id, а tbl_msg - поле msg.

tbl_id               tbl_msg

id                   msg
------               --------
1234                 test_msg
5678
9876

Теперь мой желаемый вывод должен быть в tbl_info

id    msg
---   -------
1234  test_msg
5678  test_msg
9876  test_msg

Я пишу запрос, но он показывает ошибку, что:Подзапрос возвращает более 1 ряд.Мой запрос ниже:

INSERT INTO tbl_info (id, msg) ЗНАЧЕНИЯ ((ВЫБРАТЬ id ИЗ tbl_id), (ВЫБРАТЬ msg ОТ tbl_msg))

1 Ответ

1 голос
/ 06 июля 2011

Вам нужно написать один оператор SELECT, который возвращает строки в точности так, как вы хотите, чтобы они были вставлены.

2 внутренних выбора, которые вы получили, возвращают все идентификаторы из tbl_id и все сообщения из tbl_msg, что не имеет особого смысла.

Сначала напишите выбор, например ::

SELECT tbl_id.id, tbl_msg.msg 
FROM tbl_id
JOIN tbl_msg ON tbl_id.fk = tbl_msg.fk
WHERE (...)

Тогда используйте его для ВСТАВКИ:

INSERT INTO tbl_info (id, msg)
SELECT tbl_id.id, tbl_msg.msg 
FROM tbl_id
JOIN tbl_msg ON tbl_id.fk = tbl_msg.fk
WHERE (...)

ОБНОВЛЕНИЕ в соответствии с комментариями ОП:

INSERT INTO tbl_info (id, msg)
 SELECT tbl_id.id, single_msg.msg 
 FROM tbl_id
 JOIN (SELECT msg 
      FROM tbl_msg 
      WHERE CURDATE()=DATE_FORMAT(date_time,'%Y-%m-%d') 
      ORDER BY date_time DESC LIMIT 1) as single_msg ON 1=1;

Это будет не очень эффективно, потому что внутренний выбор будет выполняться для каждой записи в tbl_id. Более эффективное решение может быть:

SELECT msg INTO @msg
FROM tbl_msg 
WHERE CURDATE()=DATE_FORMAT(date_time,'%Y-%m-%d') 
ORDER BY date_time DESC LIMIT 1;

INSERT INTO tbl_info (id, msg)
    SELECT tbl_id.id, @msg 
    FROM tbl_id;
...