我有一个同义词数据库,它有两个表,“同义词”和“synonyms_relations”就像这样......
synonyms
-------
id
word
synonyms_relations
------------------
id
word1_id
word2_id
我希望能够获得彼此相关的所有单词。 synonyms_relations表没有两个方向匹配的记录,这意味着如果word1链接到word2,那么就不会有将word2链接到word1的记录 - 它假定为两个方向都有效。
这是我必须查找单词“car”的所有同义词的查询。它有效,但似乎对我的需求来说太复杂了。有没有更好的更有效的方式来写这个?
SELECT
s.`word`
FROM
`synonyms` as s
WHERE s.`id` IN (
SELECT `word1_id` FROM `synonyms_relations` WHERE `word2_id` = (SELECT `id` FROM `synonyms` WHERE `word` = 'car')
UNION
SELECT `word2_id` FROM `synonyms_relations` WHERE `word1_id` = (SELECT `id` FROM `synonyms` WHERE `word` = 'car')
)
答案 0 :(得分:1)
以下似乎可以提供您想要的内容:
SELECT s.`word`
FROM `synonyms` s
LEFT JOIN `synonyms_relations` sr1 ON sr1.word1_id = s.id
LEFT JOIN `synonyms` s1 ON s1.id = sr1.word2_id
LEFT JOIN `synonyms_relations` sr2 ON sr2.word2_id = s.id
LEFT JOIN `synonyms` s2 ON s2.id = sr2.word1_id
WHERE (s1.`word` = 'car' OR s2.`word` = 'car')
有效地,加入具有匹配word2_id
(通过sr1
和s1
)的所有字词以及匹配word1_id
的所有字词(通过sr2
和s2
)。