1

我需要使用内部联接或右/左联接编写此查询,但我不知道如何开始:

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
4

3 回答 3

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 BYGROUP BY等),但是一旦您了解了基本查询,这还不错。

于 2015-01-28T21:53:55.750 回答
1

不要考虑从表格中选择单个值。考虑符合条件的行。最好将表视为包含使相应语句为 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 KEYUNIQUE NOT NULL)或FOREIGN KEY约束,那么我们可能知道不会有错误。当您知道不会有错误时,您应该声明相应的约束。

尽管这个新查询可能是您真正想要的。

于 2015-01-28T22:54:02.270 回答
1

这与

SELECT estudiantes.* FROM radicados 
JOIN estudiantes ON estudianteid = asignado
JOIN usuarioid ON usuarioid = usuario 
WHERE nombre =  $nombre_usuario

我在这里假设列名是唯一的。如果不是,您必须将表名称添加到字段名称。

于 2015-01-28T21:54:09.983 回答