如何编写符合指定判断逻辑的跨表SQL查询?
问题描述
我想编写一条符合以下逻辑的SQL查询语句:
IF ((从TableA中ColumnB为'someString'的行里取ColumnA的值ValueA > 1000) AND (从TableB中取ColumnB的值ValueB等于'someOtherString')) THEN 返回true ELSE 返回false
请问有什么可行的解决方案吗?
我实际尝试的语句如下:
SELECT knx.payload, piko.status FROM `KNXgroup` knx, `PIKO10data` piko WHERE 'knx.topic' = '6/4/204' ORDER BY 'knx.id' DESC LIMIT 1
但该语句无法正常运行。目前我已成功单独从两个表中获取所需的单个值,对应的语句分别为:
SELECT payload FROM `KNXgroup` WHERE `topic` = '6/4/204' ORDER BY `id` DESC LIMIT 1
以及
SELECT status FROM `PIKO10data` ORDER BY `ID` DESC LIMIT 1
解决方案
核心思路
先通过子查询获取两个表的目标最新值,再基于这两个值进行逻辑判断,返回true或false。
方法1:直接返回判断结果(MySQL适用)
使用IF函数结合子查询,直接输出条件判断的布尔结果:
SELECT IF( -- 获取KNXgroup中最新的payload值并判断是否大于1000 (SELECT payload FROM `KNXgroup` WHERE `topic` = '6/4/204' ORDER BY `id` DESC LIMIT 1) > 1000 AND -- 获取PIKO10data中最新的status值并判断是否匹配目标字符串 (SELECT status FROM `PIKO10data` ORDER BY `ID` DESC LIMIT 1) = '你需要的状态值', TRUE, FALSE ) AS condition_result;
将语句中的'你需要的状态值'替换为你实际要匹配的字符串(对应原逻辑中的someOtherString)。
方法2:同时展示目标值和判断结果
如果需要同时查看两个表的最新值和判断结果,可以用CROSS JOIN合并两个子查询的结果:
SELECT knx_latest.payload AS latest_payload, piko_latest.status AS latest_status, IF(knx_latest.payload > 1000 AND piko_latest.status = '你需要的状态值', TRUE, FALSE) AS condition_result FROM (SELECT payload FROM `KNXgroup` WHERE `topic` = '6/4/204' ORDER BY `id` DESC LIMIT 1) knx_latest, (SELECT status FROM `PIKO10data` ORDER BY `ID` DESC LIMIT 1) piko_latest;
原有语句的问题分析
你之前的查询无法运行的原因有两个:
- 字段引用错误:
WHERE 'knx.topic' = '6/4/204'和ORDER BY 'knx.id' DESC中的单引号会将knx.topic、knx.id识别为字符串常量,而非表字段。正确的写法应该是用反引号包裹字段(或直接写字段名,只要不冲突):WHERE knx.topic = '6/4/204' - 无意义的笛卡尔积:用逗号直接连接两个表会生成笛卡尔积,即把
KNXgroup的每一行与PIKO10data的每一行组合,这显然不是你想要的“取各自最新一条”的逻辑。
内容的提问来源于stack exchange,提问作者DaZeller
相关产品推荐
相关产品推荐

