在两列中的任何一列上连接表

时间:2014-02-20 23:19:29

标签: mysql sql query-optimization

我有一个同义词数据库,它有两个表,“同义词”和“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')
)

1 个答案:

答案 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(通过sr1s1)的所有字词以及匹配word1_id的所有字词(通过sr2s2)。