我在这里提出了类似的问题。。。
带有内部联接的三个表格
但我无法得到足够的答案来解决我的问题,所以我不得不再次提问。。。
我有下表。。。
**
任何想玩这些数据的人都请在这里测试http://sqlfiddle.com/#!9/a0807
**
Table1
IDA colB colC
111 a w
222 b w
333 c s
444 b g
Table2
IDB colB colC
11 w f
12 w r
13 s g
Table3
IDA IDB
111 11
222 12
333 13
444 14
以下代码将从表1复制或插入到表,但没有问题,但表2的IDB错误(因为表2的ID值应该来自表3的内部联接)
INSERT INTO table2 SELECT * FROM table1 WHERE IDA = 111
但是将所有内容从表1复制到表2,这是错误的。。。
所以,我所做的是…下面的内心连接。。。但不起作用。。
INSERT INTO table2
(SELECT * FROM table1 b
LEFT JOIN table3 c ON c.IDA = b.IDA
LEFT JOIN table2 a ON a.IDB = c.IDB)
WHERE IDB = 111
这也不起作用。。。。
但是,我需要的正是。。。我想从表1复制到表,通过表3连接,如果行可用,则更新,如果不插入。。。。
很抱歉问了两次,但我很想从你们那里得到一些想法。。。
请帮忙。。。提前感谢。。。
可能正在使用php,如果可能的话可以处理。。。
尝试使用类似的ON DUPLICATE KEY
$sql = "INSERT INTO `table2` (Col2, Col3)
VALUES ('val1', 'val2')
ON DUPLICATE KEY UPDATE
Col2='val1', Col3='val2'";
编辑:
INSERT INTO table2 (ColB , ColC)
(SELECT ColB.b,ColC.b FROM table1 b
LEFT JOIN table3 c ON c.IDA = b.IDA
LEFT JOIN table2 a ON a.IDB = c.IDB
WHERE IDB = 111
)
ON DUPLICATE KEY UPDATE
ColB = ColB.b
ColC = ColC.b
并且尽量避免使用mysql_*
语句,因为整个ext/mysql PHP
扩展提供了所有以前缀mysql_*
命名的函数,从PHP v5.5.0
起,该扩展已被正式弃用,并且将来将被删除。
还有另外两个MySQL
扩展可以更好地使用:MySQLi
和PDO_MySQL
,它们中的任何一个都可以用来代替ext/mysql
。
使用类似的查询
插入表2(ColB,ColC)从表1中选择ColB,ColC,IDA='111'