首先,架构不是我的。这太可怕而且非常令人困惑。还有一个警告 - 这很复杂。
我有3个表格 - tbl_a
,tbl_b
和tbl_c
。 switch
实际上是tbl_a
中实体(记录)的属性。但只能通过JOIN
上的tbl_b
然后tbl_c
访问:
+---------+ +---------+ +---------+
| tbl_a | | tbl_b | | tbl_c |
+---------+ +---------+ +---------+
| a_id | +--> | b_id | +--> | c_id |
| b_fk | <--+ | c_fk | <--+ | switch |
+---------+ +---------+ +---------+
+---------+
| tbl_his |
+---------+
| his_id |
| a_fk |
| coef |
+---------+
要添加功能,我需要创建第四个表(tbl_his
) - 我已经完成了。在此表中,我有一个coef
列,可以取1到100之间的任意数字。我需要在每个tbl_his
的记录中填充表tbl_a
一个记录。目前的数据switch
可以是0
,也可以是1
。
对于tbl_a
中switch
0
tbl_his
的每条记录,我应该将记录添加到NULL, 'a_id', '100'
作为
1
如果记录的开关是tbl_his
,我应该将以下记录添加到NULL, 'a_id', '50'
:
50
这个查询会完成一半的工作吗?有可能一次性同时执行100
条记录和INSERT INTO `tbl_his` (`his_id`, `a_fk`, `coef`) VALUES (NULL, 'tbl_a.id', '100')
WHERE (
SELECT tbl_a.id
FROM tbl_a
LEFT JOIN tbl_b ON tbl_a.b_fk = tbl_b.id
LEFT JOIN tbl_c ON tbl_b.c_fk = tbl_c.c_id
WHERE tbl_c.switch = '0')
条记录吗?
{{1}}
答案 0 :(得分:3)
没有INSERT INTO...WHERE
查询语法这样的东西。你想要的是INSERT INTO...SELECT
。
即
INSERT INTO
tbl_his (a_fk, coef)
SELECT
tbl_a.id,
CASE WHEN tbl_c.switch = 0 THEN 100 ELSE 50 END
FROM
tbl_a
LEFT JOIN
tbl_b
ON
tbl_a.b_fk = tbl_b.id
LEFT JOIN
tbl_c
ON
tbl_b.c_fk = tbl_c.c_id
答案 1 :(得分:1)
将LEFT放在连接上。你的where子句在非法的地方。插入查询中的值并计算coef。如果所有开关值均为0或1,则可以删除最后一行。
INSERT INTO tbl_his (his_id, a_fk, coef)
SELECT NULL, tbl_a.id, 100-50*tbl_c.switch
FROM tbl_a
JOIN tbl_b ON tbl_a.b_fk = tbl_b.id
JOIN tbl_c ON tbl_b.c_fk = tbl_c.c_id
WHERE switch BETWEEN 0 AND 1;