不要考虑从表格中选择单个值。考虑符合条件的行。最好将表视为包含使相应语句为 true的行,而将查询视为使相应语句为 true 的计算行。首先你选择声明;然后编写与该语句对应的查询。以下是如何设计查询。
//*
all radicados columns of the rows where
a subrow is IN radicados AND a subrow is IN estudiantes
AND asignado = estudianteid
AND a subrow is IN usarios
AND usuarioid = usuario
AND nombre = $nombre_usuario
*//
select radicados.*
from radicados
join estudiantes on estudianteid = asignado
join usuarios on usarioid = usario
and nombre = $nombre_usuario
当您的原始查询未报告运行时错误时,此查询将返回相同的行。但它不一定是等效查询,因为当给定用户编号 (usuarios nombre) 有多个用户 ID (usarios usuarioid) 或所选用户有多个学生 ID (estudiantes estudianteid) 时,您的原始查询会报告运行时错误用户 ID(usuarios usario)。
//*
all columns of the radicados rows where
asignado =
the one estudianteid shared by the estudiantes rows where
usuario =
the one usuarioid shared by the usuarios rows where
nombre = $nombre_usuario
*//
select * from radicados
where asignado =
(select estudianteid from estudiantes
where usuario =
(select usuarioid from usuarios
where nombre = $nombre_usuario
)
)
这是因为表达式值 = (SELECT ...)
只有在SELECT
返回一列一行的表时才不会出现运行时错误。如果是这样,它将值与该表中的一个值进行比较,否则会给出错误。
如果您提供了表定义并且声明了某些候选键(PRIMARY KEY
或UNIQUE NOT NULL
)或FOREIGN KEY
约束,那么我们可能知道不会有错误。当您知道不会有错误时,您应该声明相应的约束。
尽管这个新查询可能是您真正想要的。