两个表

时间:2015-12-14 02:47:06

标签: mysql

我试图编写一个组合来自两个表的数据的查询。两个表都包含有关某些对象的信息。对象由三元组(x,y,z)(每个x,y和z在T1中具有单独的列)以及其名称(T1中的主键)唯一地定义。在T2中,主键是name2。还有一个列名1表示对象名2链接到的对象,列w。所以T1包含了对象'名称及其三元组,而T2告诉我们哪些对象是链接的('链接'不是等价,如果object1链接到object2,则object2没有链接到对象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再到T1再回到T1。

1 个答案:

答案 0 :(得分:2)

根据您的问题,我读了表定义:

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
  

我们给出了x,y和t,并希望对象的三元组链接到第一个坐标上带有x和y的对象,并且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 cluase中引用了所需的所有表和表角色。所以它变成

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

我确信你可以完成订购。

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

我意识到这是一个例子,你可能已经简化了#34;问题的名称,但是当你发现自己用数字后缀命名列时,你就会做错事。也许你还没有充分规范化,或者你可能还没有理解数据项之间的关系。