吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 916|回复: 15
收起左侧

[求助] sql优化请教

[复制链接]
ppgjx 发表于 2022-4-25 17:14
本帖最后由 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_id  device_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 device  d1 where d1.device_uuid  in (select device_uuid  from device d where d.device_status = '在线'))

但是这个sql子查询太多 非常影响性能 如何优化呢?







发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

landwind 发表于 2022-4-25 17:19
本帖最后由 landwind 于 2022-4-25 17:21 编辑

1002           00000          在线
下面结果为啥成了1001?
假设结果应该是1002, 你看看下面满足你不
[SQL] 纯文本查看 复制代码
select t.* from task表 t left join device表 d on  t.device_id = d.device_id 
where d.device_status='在线'
 楼主| ppgjx 发表于 2022-4-25 17:22
landwind 发表于 2022-4-25 17:19
1002           00000          在线
下面结果为啥成了1001?

这个任务是由这个设备id执行的呀
landwind 发表于 2022-4-25 17:25
ppgjx 发表于 2022-4-25 17:22
这个任务是由这个设备id执行的呀

你条件不是查询在线状态吗, device表只有1002在线, 你结果1001设备咋出来的
 楼主| ppgjx 发表于 2022-4-25 17:26
landwind 发表于 2022-4-25 17:19
1002           00000          在线
下面结果为啥成了1001?
假设结果应该是1002, 你看看下面满足你不

这个我试过 不对呀 我的意思是 device_uuid是一个标准的设备 如果在device表中  device_uuid所有的记录 只要有一条记录在线 那么该设备下的deivce_id都符合条件
landwind 发表于 2022-4-25 17:31
本帖最后由 landwind 于 2022-4-25 17:33 编辑
ppgjx 发表于 2022-4-25 17:26
这个我试过 不对呀 我的意思是 device_uuid是一个标准的设备 如果在device表中  device_uuid所有的记录  ...

明白了, 给你一个最搓的套娃, 查 三次, 搓的很
[SQL] 纯文本查看 复制代码
select t.* from task t where t.device_id in (select device_id from device  d1 where d1.device_uuid  in (select device_uuid  from device d where d.device_status = '在线'))
 楼主| ppgjx 发表于 2022-4-25 17:37
landwind 发表于 2022-4-25 17:31
明白了, 给你一个最搓的套娃, 查 三次, 搓的很[mw_shl_code=sql,true]select t.* from task t where t.de ...

这样好像也行 select * from task where deivce_id in (select device_id from device where status = "在线") 但是子查询太影响性能了
landwind 发表于 2022-4-25 17:40
ppgjx 发表于 2022-4-25 17:37
这样好像也行 select * from task where deivce_id in (select device_id from device where status = " ...

这个不行的, uuid对着多个device_id, 你这么查会漏数据; 你给的例子按照你的查询方式就查不到数据
 楼主| ppgjx 发表于 2022-4-25 17:50
landwind 发表于 2022-4-25 17:40
这个不行的, uuid对着多个device_id, 你这么查会漏数据; 你给的例子按照你的查询方式就查不到数据

确实不对 大佬 这个没办法优化吗 这个子查询好像非常影响性能
James2119 发表于 2022-4-25 18:20
本帖最后由 James2119 于 2022-4-25 11:29 编辑

最能理解的就是多层嵌套
[SQL] 纯文本查看 复制代码
SELECT * FROM TASK WHERE DEVICE_ID IN(SELECT DEVICE_ID FROM DEVICE WHERE DEVICE_UUID IN(SELECT DEVICE_UUID FROM DEVICE WHERE DEVICE_STATUS = '在线'));

如果要优化的话,不知道这样行不行
[SQL] 纯文本查看 复制代码
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);
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 12:32

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表