在一个查询中上下移动表关系

时间:2015-05-25 21:53:52

标签: mysql join

我想做什么

我有三张桌子。 words表,relationships表,使用a_keyb_key以及contexts表从单词表中获取两个ID,其中包含两个ID使用x_keyy_key的关系表。我想从单词表中查找一个单词,在关系表中找到它的每个实例,并在上下文表中查找这些关系的每个实例,然后沿着关系工作,以获取通过代理连接的所有单词。 / p>

我在尝试什么

数据

words
id      word
3       car
5       road
9       wheel

relationships
id      a_key   b_key
1       3       5
2       5       9

contexts
id      x_key   y_key
1       1       2

目标

当我得到汽车这个词时,要知道它已被用在与轮子相同的句子中。所以我给它ID 3,而3与ID 5有关系,它有ID 5和ID 9之间关系的上下文,我应该能够返回ID 9的单词。

查询

        select * from `words` 
        left join `relationships` 
            on relationships.a_key in (3,5,9)
            left join `contexts`
                on relationships.id = contexts.y_key

这是我能够得到的。

我缺少什么

我不明白该怎么做,是使用查询结果构建另一个查询而不启动新查询。我正在研究使用别名AS a,并且分层选择SELECT *, (SELECT *, (SELECT *,但我没有找到任何有关它在这种情况下应用的方法。

2 个答案:

答案 0 :(得分:2)

你可以尝试这个,伙计:

SELECT
    w_1.*,
    w_2.*
FROM
    words w_1
    LEFT JOIN relationships r_1 ON r_1.a_key = w_1.id
    LEFT JOIN contexts c ON c.x_key = r_1.id
    LEFT JOIN relationships r_2 ON r_2.id = c.y_key
    LEFT JOIN words w_2 ON w_2.id = r_2.b_key
WHERE
    w_1.word = 'car';  

E:结果基于我的理解,您希望从您的初始输入中获​​得另一个单词,即 car ,第二个单词是 wheel

更新

试试这个,伙计:

SELECT
    w2.*
FROM
    words w1
    INNER JOIN relationships r1 ON r1.a_key = w1.id
    INNER JOIN relationships r2 ON r2.a_key = r1.b_key
    INNER JOIN contexts c1 ON c1.x_key = r1.id OR c1.x_key = r2.id
    INNER JOIN relationships r3 ON r3.id = c1.y_key
    INNER JOIN words w2 ON w2.id = r3.b_key
WHERE
    w1.word = 'car';  

E:这个基于单词的上下文记录或它有关系的单词的上下文记录返回单词表中具有relationships.id的记录。该关系基于根表,即单词(w_1)。希望这可以帮助,欢呼。

答案 1 :(得分:1)

下面是SQL,它将为给定的contexts ID提供单词关系,在本例中为contexts ID 1。

使用contextsUNION表中选择两次。第一个加入x_key relationships,然后加入wordsa_key上的b_key。第二次加入y_keyrelationships,然后加入wordsa_key上的b_key

SELECT
  w_1.word,
  w_2.word
FROM
    contexts c
    LEFT JOIN relationships r_1 ON r_1.id = c.x_key
    LEFT JOIN words w_1 ON w_1.id = r_1.a_key
    LEFT JOIN words w_2 ON w_2.id = r_1.b_key
WHERE
    c.id = 1

UNION

SELECT
  w_1.word,
  w_2.word
FROM
    contexts c
    LEFT JOIN relationships r_1 ON r_1.id = c.y_key
    LEFT JOIN words w_1 ON w_1.id = r_1.a_key
    LEFT JOIN words w_2 ON w_2.id = r_1.b_key
WHERE
    c.id = 1
    ;  

SQL Fiddle结果

word    word
car     road
road    wheel

更新,要选择单词,您可以执行以下操作。

SELECT
  w_1.word,
  w_2.word
FROM
    contexts c
    LEFT JOIN relationships r_1 ON r_1.id = c.x_key
    LEFT JOIN words w_1 ON w_1.id = r_1.a_key
    LEFT JOIN words w_2 ON w_2.id = r_1.b_key
WHERE
    w_1.word = 'car'

UNION

SELECT
  w_1.word,
  w_2.word
FROM
    contexts c
    LEFT JOIN relationships r_1 ON r_1.id = c.y_key
    LEFT JOIN words w_1 ON w_1.id = r_1.a_key
    LEFT JOIN words w_2 ON w_2.id = r_1.b_key
WHERE
    w_2.word = 'car'
    ;  

SQL Fiddle results for this

word    word
car     road