我想做什么
我有三张桌子。 words
表,relationships
表,使用a_key
和b_key
以及contexts
表从单词表中获取两个ID,其中包含两个ID使用x_key
和y_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 *
,但我没有找到任何有关它在这种情况下应用的方法。
答案 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。
使用contexts
从UNION
表中选择两次。第一个加入x_key
relationships
,然后加入words
和a_key
上的b_key
。第二次加入y_key
至relationships
,然后加入words
和a_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
;
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'
;
word word
car road