如果值存在于 2 table 中的一个中,比如 B 和 C,我如何使用 table A 中的值插入或更新数据?
How do I insert or update data using value in table A if a value exists in one of 2 tables say, B and C?
我有 3 tables:
switches (device_id char(20), room_id char(36), ...)
sensors (device_id char(20), room_id char(36), ...)
device_rssi (device_addr char(16), room_id char(36), rssi, ...)
这是我想要做的:
If addr already exists in device_rssi
then
update the rssi in the device_rssi table
else
if addr exists in either switches or sensors tables
get the room_id for that addr from whichever table it exists in
add the rssi along with the room_id in the device_rssi table
(注意 device_id 是 'device_addr + 4 chars')
这是我当前的查询:
SELECT *
FROM
(
SELECT room_id
FROM switches
WHERE device_id like addr____
UNION
SELECT room_id
FROM sensors
WHERE device_id like addr____
);
然后在我的 C 代码中,我检查查询是否返回了 room_id 后跟此查询:
INSERT INTO device_rssi
(device_addr, room_id, rssi) VALUES (addr, room_id, rssi)
ON DUPLICATE KEY
UPDATE room_id = room_id, rssi = rssi;
首先,我希望有一个 'devices' table,其中开关和传感器都具有 device_id、room_id 字段的外键引用.那会解决我的 "checking whether a device_addr exists in either of the tables and getting the room_id" 问题。但我不允许这样做,因为这会给 app/web 服务人员增加太多工作量。所以,我必须利用我所拥有的。
其次,我讨厌每次更新 rssi 时都会查询 room_id,即使 room_id 对于 switch/sensor 很少会改变。
当然,更不用说本应非常简单的事情了,我提出了 2 个查询,其中 1 个查询具有 2 个子查询的并集。呃!
我相信即使不修改架构也必须有更好的方法来执行此操作,但我似乎找不到它。任何帮助将不胜感激!谢谢!
(顺便说一句,我是一个没有数据库经验的嵌入式人员,所以如果这是一个愚蠢的问题或者我公然错过了一个愚蠢的简单解决方案,请原谅我。)
我在没有测试的情况下写了下面的查询,所以可能会有一些错误。
请将 'ADDR' 和 'RSSI' 替换为正确的值(已编码)或使用查询参数来避免 SQL 注入。
INSERT INTO device_rssi(device_addr, room_id, rssi)
select * from (
select 'ADDR', room_id, 'RSSI' from device_rssi where device_addr='ADDR'
union
select 'ADDR', room_id, 'RSSI' from switches where device_id like 'ADDR____'
union
select 'ADDR', room_id, 'RSSI' from sensors where device_id like 'ADDR____'
) tmp limit 1
ON DUPLICATE KEY
UPDATE rssi = 'RSSI';
这并不理想,尤其是因为 device_addr 与 device_id 不同,并且因为您可以在传感器和开关中拥有相同的 device_id 记录。
我有 3 tables:
switches (device_id char(20), room_id char(36), ...)
sensors (device_id char(20), room_id char(36), ...)
device_rssi (device_addr char(16), room_id char(36), rssi, ...)
这是我想要做的:
If addr already exists in device_rssi
then
update the rssi in the device_rssi table
else
if addr exists in either switches or sensors tables
get the room_id for that addr from whichever table it exists in
add the rssi along with the room_id in the device_rssi table
(注意 device_id 是 'device_addr + 4 chars')
这是我当前的查询:
SELECT *
FROM
(
SELECT room_id
FROM switches
WHERE device_id like addr____
UNION
SELECT room_id
FROM sensors
WHERE device_id like addr____
);
然后在我的 C 代码中,我检查查询是否返回了 room_id 后跟此查询:
INSERT INTO device_rssi
(device_addr, room_id, rssi) VALUES (addr, room_id, rssi)
ON DUPLICATE KEY
UPDATE room_id = room_id, rssi = rssi;
首先,我希望有一个 'devices' table,其中开关和传感器都具有 device_id、room_id 字段的外键引用.那会解决我的 "checking whether a device_addr exists in either of the tables and getting the room_id" 问题。但我不允许这样做,因为这会给 app/web 服务人员增加太多工作量。所以,我必须利用我所拥有的。
其次,我讨厌每次更新 rssi 时都会查询 room_id,即使 room_id 对于 switch/sensor 很少会改变。
当然,更不用说本应非常简单的事情了,我提出了 2 个查询,其中 1 个查询具有 2 个子查询的并集。呃!
我相信即使不修改架构也必须有更好的方法来执行此操作,但我似乎找不到它。任何帮助将不胜感激!谢谢!
(顺便说一句,我是一个没有数据库经验的嵌入式人员,所以如果这是一个愚蠢的问题或者我公然错过了一个愚蠢的简单解决方案,请原谅我。)
我在没有测试的情况下写了下面的查询,所以可能会有一些错误。 请将 'ADDR' 和 'RSSI' 替换为正确的值(已编码)或使用查询参数来避免 SQL 注入。
INSERT INTO device_rssi(device_addr, room_id, rssi)
select * from (
select 'ADDR', room_id, 'RSSI' from device_rssi where device_addr='ADDR'
union
select 'ADDR', room_id, 'RSSI' from switches where device_id like 'ADDR____'
union
select 'ADDR', room_id, 'RSSI' from sensors where device_id like 'ADDR____'
) tmp limit 1
ON DUPLICATE KEY
UPDATE rssi = 'RSSI';
这并不理想,尤其是因为 device_addr 与 device_id 不同,并且因为您可以在传感器和开关中拥有相同的 device_id 记录。