查询返回未请求的额外数据及工单状态变更后跨视图异常显示问题求助
I have an issue where changing the status of a turn causes it to appear in other views where it shouldn't. For example, if I set a turn in 'technical support' to 'pending,' it also appears in 'payment' and 'inquiry,' even though it should only be shown in the designated view without altering the data.
看起来你遇到的问题根源在于getTurnosByDestino函数里的SQL查询逻辑错误,逻辑运算符优先级在这里坑了你!
你当前的SQL语句是:
SELECT * FROM turnos WHERE DESTINO = $1 AND ESTADO = $2 OR ESTADO = $3 OR ESTADO = $4 ORDER BY CREADO_A ASC
因为SQL中AND的优先级高于OR,这条语句会被数据库解析成:
SELECT * FROM turnos WHERE (DESTINO = $1 AND ESTADO = $2) OR ESTADO = $3 OR ESTADO = $4 ORDER BY CREADO_A ASC
这就意味着:只要工单状态是ATENDIENDO或者LLAMANDO,不管它的DESTINO是什么,都会被查询出来!这就是为什么技术支持的工单会出现在付款、咨询视图里的原因。
解决方案
你需要给状态相关的OR条件加上括号,确保DESTINO = $1和所有状态条件是同时满足的关系,修改后的SQL应该是:
SELECT * FROM turnos WHERE DESTINO = $1 AND (ESTADO = $2 OR ESTADO = $3 OR ESTADO = $4) ORDER BY CREADO_A ASC
对应的getTurnosByDestino函数修改后如下:
const getTurnosByDestino = async (destino) => { try { return await handleDatabaseQuery( 'SELECT * FROM turnos WHERE DESTINO = $1 AND (ESTADO = $2 OR ESTADO = $3 OR ESTADO = $4) ORDER BY CREADO_A ASC', [destino, 'PENDIENTE', 'ATENDIENDO', 'LLAMANDO'] ); } catch (error) { throw new Error(`Error fetching turnos for destino ${destino}`); } };
额外检查
我看了一下你代码里的getTurnosByDestinoComentarios函数,它的SQL语句是正确的——用AND连接所有条件,没有优先级问题,所以不需要修改。
修改后,每个视图只会查询到对应DESTINO且状态为PENDIENTE/ATENDIENDO/LLAMANDO的工单,不会再出现跨视图显示的问题了。
备注:内容来源于stack exchange,提问作者Swiftboat

