mysql - 两个表之间的嵌套查询

标签 mysql

我正在尝试编写一个组合两个表中的数据的查询。两个表都包含有关某些对象的信息。对象由三元组 (x,y,z)(每个 x、y 和 z 在 T1 中都有一个单独的列)及其名称(T1 中的主键)唯一定义。在 T2 中,主键是 name2。还有一个列 name1,它指示对象 name2 链接到的对象,还有一个列 w。因此,T1 包含对象的名称及其三元组,而 T2 告诉我们链接了哪些对象(“链接”不是等价物,如果对象 1 链接到对象 2,则对象 2 不链接到对象 1)。

我们给定了 x、y 和 t,并且想要将对象的三元组链接到第一个坐标上带有 x 和 y 且 w>t 的对象。

我尝试编写一个查询,其中我们需要匹配具有特定名称的对象:

SELECT 
    (SELECT x FROM T1 WHERE name=name2), 
    (SELECT y FROM T1 where name=name2) AS k, 
    w 
FROM T2 
WHERE name1=nn3 
AND w>t 
ORDER BY k;

但是当我们可能有多个来自 T1 的对象时,我不知道如何编写它。

我无权访问数据库,我只知道表的列,所以如果不在数据库上尝试,我很难解决这个问题。我对从 T1 到 T2 再回到 T1 感到困惑。

最佳答案

从你的问题中我读到的表定义是:

T1            -- a list of objects
    x,
    y,
    z,
    name      -- primary key, hence unique

T2            -- a list of objects linked to an object in T1
    name2,    -- primary key
    name1,    -- foreign key to T1.name
    w

如果我们有三个对象 A、B 和 C,这三个对象都会出现在 T1 中。如果 B 和 C 链接到 A,T2 将(除其他)

Name2  Name1
B      A
C      A

We are given x, y and t and want the triples of the object that are linked to objects with x and y on their first coordinate with w>t.

正如您所指出的,T1 包含有关对象的信息,T2 包含有关对象如何链接的信息。要从多个表中检索匹配信息,请使用 JOIN 语法。由于链接中有两个对象,因此必须为每个对象建立一个单独的 JOIN。在查询中多次引用同一个表是可以的。您应该使用别名来阐明每次提到表时所扮演的角色。这给出了类似的东西

from T2 as linkage
inner join T1 as linked_from
    on linked_from.name = T2.name1  -- note different columns in T2
inner join T1 as linked_to
    on linked_to.name = T2.name2    -- note different columns in T2

我个人不喜欢 linked_fromlinked_to 因为它们模糊且通用。您应该使用针对您的问题而言具体且有意义的内容。

您没有说明给定的 x 和 y 是否引用 linked_from 或 linked_to 对象。这对于查询的输出非常重要,但是在 SQL 中更改是微不足道的 - 只需使用其他别名 - 所以我假设它是父对象。 where 子句是

where link_from.x = @x_given_value
and link_from.y = @y_given_value
and linkage.w > @t_given_value

您不需要在 SELECT 子句中添加额外的子查询,因为您已经在 FROM 子句中引用了所需的所有表和表角色。于是就变成了

SELECT
    link_to.x,
    link_to.y as k,
    linkage.w

我相信您可以制定订单。

请注意数据库中涉及的基数,即有多少行匹配每个条件。您声明 x、y 和 z 一起是唯一的。由于仅提供了 x 和 y,您很可能会返回多行。类似地,即使对于相同的 name1、name2 值,也可能有许多行的 w 值大于给定的 t 值。 T1 中的每一行在 T2 中都会有很多行。

我意识到这是一个例子,您可能已经“简化”了问题的名称,但是任何时候您发现自己用数字后缀命名列,您就做错了。也许您还没有充分标准化,或者您还没有理解数据项之间的关系。

关于mysql - 两个表之间的嵌套查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34558008/

相关文章:

android - 如何创建不重复的组合并存储在android studio的数据库中?

mysql - 如何加快mysql中另一个表聚合的计数?

mysql - 我在 SubSonic 3 和 MySQL 的无符号数据类型方面遇到问题

MySQL删除-选择行

javascript - 从 javascript 向 php 发送日期时间时管理夏令时

mysql - 在使用 GROUP BY 之前对数据进行排序?

android - Mysql 与 Parse.com

mysql - Date = max(Date) 运行缓慢

mysql - 从整数年、月和日期构造 java.sql.Date

MySQL 连接代码需要修复。我陷入了死胡同