Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如果有一个值存在于两个表(如B和C)中,我如何使用表A中的值插入或更新数据?_Mysql_Polymorphic Associations - Fatal编程技术网

Mysql 如果有一个值存在于两个表(如B和C)中,我如何使用表A中的值插入或更新数据?

Mysql 如果有一个值存在于两个表(如B和C)中,我如何使用表A中的值插入或更新数据?,mysql,polymorphic-associations,Mysql,Polymorphic Associations,我有三张桌子: 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 updat

我有三张桌子:

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
(请注意,设备id为“设备地址+4个字符”)

以下是我当前的查询:

SELECT *
FROM
    (
    SELECT room_id
    FROM switches
    WHERE device_id like addr____
    UNION
    SELECT room_id
    FROM sensors
    WHERE device_id like addr____
    );
然后在我的C代码中,我检查查询是否返回了一个房间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;
首先,我希望有一个“设备”表,其中开关和传感器都有设备id、房间id字段的外键引用。这就解决了我“检查两张表中是否存在设备地址并获取房间id”的问题。但我不被允许这样做,因为这会给应用程序/网络服务人员增加太多工作。所以,我必须用我所拥有的来工作

其次,我讨厌每次更新rssi时都要查询房间id,即使开关/传感器的房间id几乎不会改变

当然,更不用说应该非常简单的事情了,我提出了两个查询,其中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\u addr与device\u id不完全相同,而且传感器和交换机中都可以有相同的device\u id记录。

我在没有测试的情况下编写了下面的查询,因此可能会出现一些错误。 请将“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';

这并不理想,特别是因为设备地址与设备id不相同,而且传感器和交换机中都可以有相同的设备id记录。

Ah!看起来比我的解决方案好多了。请注意,设备id不能同时存在于交换机和传感器中,也可以仅存在于其中一个中。我会尝试一下并发布更新!谢谢:-)带有
union
的大型select正在所有三个表中搜索,
limit
子句将只取第一个。如果第一条记录是在device_rssi表中找到的记录,则重复上的
部分将启动。正如您所说,如果device_rssi表中已经存在“addr”,则重复上的部分将启动,因此,我真的需要device_addr表的“select”查询吗?只有开关和传感器上的“选择”联合才能完成工作,对吗?如果不包括设备添加,并且开关和传感器中没有合适的数据,联合将不返回任何内容。如果未返回任何内容,则不会尝试插入,也没有理由调用“on duplicate”。我希望这是有道理的如果开关或传感器中没有与设备地址匹配的设备id,则无论如何都不应插入任何内容!如果DB中没有设备,我就不想跟踪它的信号强度:-)啊!看起来比我的解决方案好多了。请注意,设备id不能同时存在于交换机和传感器中,也可以仅存在于其中一个中。我会尝试一下并发布更新!谢谢:-)带有
union
的大型select正在所有三个表中搜索,
limit
子句将只取第一个。如果第一条记录是在device_rssi表中找到的记录,则重复上的
部分将启动。正如您所说,如果device_rssi表中已经存在“addr”,则重复上的部分将启动,因此,我真的需要device_addr表的“select”查询吗?只有开关和传感器上的“选择”联合才能完成工作,对吗?如果不包括设备添加,并且开关和传感器中没有合适的数据,联合将不返回任何内容。如果未返回任何内容,则不会尝试插入,也没有理由调用“on duplicate”。我希望这是有道理的如果开关或传感器中没有与设备地址匹配的设备id,则无论如何都不应插入任何内容!如果DB中不存在设备,我不想跟踪其信号强度:-)