我正在尝试编写一个组合两个表中的数据的查询。两个表都包含有关某些对象的信息。对象由三元组 (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_from
和 linked_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/