我需要使用内部联接或右/左联接来编写此查询,但我不知道如何启动:
select * from radicados where asignado =
(select estudianteid from estudiantes where usuario =
(select usuarioid from usuarios where nombre = $nombre_usuario))
但我不知道如何对连接做同样的事情。
我认为这必须是这样的:
select * from radicados inner join usuarios on usuarioid=usuario
答案 0 :(得分:2)
看来你想要这样的东西:
select radicados.*
from
radicados
join estudiantes
on radicados.asignado = estudiantes.estudianteid
join usarios
on estudiantes.usario = usarios.usarioid
where usarios.nombre = $nombre_usuario
在构造此类查询时,请从FROM
子句开始。根据它们之间的关系将包含所需数据的各个表连接在一起。如果需要,请添加一个WHERE
子句,描述您要过滤连接结果的任何其他条件。然后根据需要填写SELECT
列表。
在某些情况下,您可能还需要添加其他条款(ORDER BY
,GROUP BY
等),但是一旦您理解了基本查询,那就不错了。
答案 1 :(得分:1)
这与
相同SELECT estudiantes.* FROM radicados
JOIN estudiantes ON estudianteid = asignado
JOIN usuarioid ON usuarioid = usuario
WHERE nombre = $nombre_usuario
我在这里假设列名是唯一的。如果不是,则必须将表名添加到字段名称。
答案 2 :(得分:1)
不要考虑从表中选择单个值。考虑符合标准的行。更好的做法是将一个表视为包含行,使相应的语句为真,将查询视为计算行,使相应的语句为真。首先你选择陈述;然后你编写与该语句对应的查询。 Here is how to design queries.
//*
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 ...)
返回一个包含一列和一行的表时,表达式 value SELECT
才是运行时无错误的。如果是这样,它会将 value 与该表中的一个值进行比较,否则会出错。
如果您提供了表格定义,并且您宣布了某些候选键(PRIMARY KEY
或UNIQUE NOT NULL
)或FOREIGN KEY
约束,那么我们可能会知道不会出现错误。当您知道没有错误时,您应该声明相应的约束。
虽然这个新查询可能是你真正想要的那个。