MySQL:如何从两个表中获取数据并存储到一个表中

时间:2011-07-06 10:43:16

标签: mysql sql mysql-error-1242

我有三个table.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)VALUES((SELECT id FROM tbl_id),(SELECT msg FROM tbl_msg))

1 个答案:

答案 0 :(得分:1)

您需要编写一个SELECT语句,该语句完全按照您希望的方式返回行。

2个内部选择你从tbl_id返回所有id和来自tbl_msg的所有msg,这没有多大意义。

首先编写select,例如:

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

然后将其用于INSERT:

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 (...)

更新根据OP的评论:

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;