sql优化请教
本帖最后由 ppgjx 于 2022-4-25 18:19 编辑我有两张表 一个是设备表 一个是设备执行的任务表分别为
device表
下面是字段
device_id设备记录id device_uuid 设备唯一标识符device_status 设备状态 分为在线和离线
应用场景是 设备每天早上8点进行报到 也就是服务器添加一条这个设备的记录 此时设备状态是在线的 晚上6点后这个设备被设置为离线了 第二天还是一样添加一条记录 设置为在线 晚上设置为离线
task表
task_id 任务记录id device_id 设备id task_value内容
应用场景 在早上8点到晚上6点会添加任务到这个记录里 现在需要写一个sql 就是 查找任务表 只要这个设备也是就device_uuid能查到在线状态的记录(select * from device where device_status = "在线") 这个任务就符合条件 不管是哪一天
假如表数据库是这样的
device表
device_iddevice_uuid device_status
1001 00000 离线
1002 00000 在线
1003 11111 离线
1004 11111 离线
task表
task_id device_id task_value
50001 1001 打扫卫生
50002 1001 打扫卫生
50003 1004 逛吾爱破解论坛
符合条件的记录应该是
task_id device_id task_value
50001 1001 打扫卫生
50002 1001 打扫卫生
这种sql怎么写呢?
经过大佬回答 我得到可以使用的sql
select t.* from task t where t.device_id in (select device_id from deviced1 where d1.device_uuidin (select device_uuidfrom device d where d.device_status = '在线'))
但是这个sql子查询太多 非常影响性能 如何优化呢?
本帖最后由 landwind 于 2022-4-25 17:21 编辑
1002 00000 在线
下面结果为啥成了1001?
假设结果应该是1002, 你看看下面满足你不
select t.* from task表 t left join device表 d ont.device_id = d.device_id
where d.device_status='在线' landwind 发表于 2022-4-25 17:19
1002 00000 在线
下面结果为啥成了1001?
这个任务是由这个设备id执行的呀 ppgjx 发表于 2022-4-25 17:22
这个任务是由这个设备id执行的呀
{:1_924:}你条件不是查询在线状态吗, device表只有1002在线, 你结果1001设备咋出来的 landwind 发表于 2022-4-25 17:19
1002 00000 在线
下面结果为啥成了1001?
假设结果应该是1002, 你看看下面满足你不
这个我试过 不对呀 我的意思是 device_uuid是一个标准的设备 如果在device表中device_uuid所有的记录 只要有一条记录在线 那么该设备下的deivce_id都符合条件 本帖最后由 landwind 于 2022-4-25 17:33 编辑
ppgjx 发表于 2022-4-25 17:26
这个我试过 不对呀 我的意思是 device_uuid是一个标准的设备 如果在device表中device_uuid所有的记录...
明白了, 给你一个最搓的套娃, 查 三次, 搓的很select t.* from task t where t.device_id in (select device_id from deviced1 where d1.device_uuidin (select device_uuidfrom device d where d.device_status = '在线')) landwind 发表于 2022-4-25 17:31
明白了, 给你一个最搓的套娃, 查 三次, 搓的很select t.* from task t where t.de ...
这样好像也行 select * from task where deivce_id in (select device_id from device where status = "在线") 但是子查询太影响性能了 ppgjx 发表于 2022-4-25 17:37
这样好像也行 select * from task where deivce_id in (select device_id from device where status = " ...
这个不行的, uuid对着多个device_id, 你这么查会漏数据; 你给的例子按照你的查询方式就查不到数据 landwind 发表于 2022-4-25 17:40
这个不行的, uuid对着多个device_id, 你这么查会漏数据; 你给的例子按照你的查询方式就查不到数据
确实不对 大佬 这个没办法优化吗 这个子查询好像非常影响性能 本帖最后由 James2119 于 2022-4-25 11:29 编辑
最能理解的就是多层嵌套
SELECT * FROM TASK WHERE DEVICE_ID IN(SELECT DEVICE_ID FROM DEVICE WHERE DEVICE_UUID IN(SELECT DEVICE_UUID FROM DEVICE WHERE DEVICE_STATUS = '在线'));
如果要优化的话,不知道这样行不行
SELECT * FROM TASK WHERE DEVICE_ID IN(
SELECT DEVICE_ID
FROM (
SELECT DEVICE_ID, DEVICE_UUID
FROM DEVICE A
WHERE DEVICE_STATUS = '在线') A
JOIN DEVICE B ON A.DEVICE_UUID = B.DEVICE_UUID);
页:
[1]
2