1

我知道 SQL n:n 查询已经开始了很多问题。但是我找不到我的问题的解决方案。

我想创建一个类似于个人词库的项目。在其中,用户可以定义哪个单词与其他单词相关。我有两张桌子:

words:
+----+-----------+
| id | word      |
+----+-----------+
|  1 | house     |
|  2 | residence |
+----+-----------+

words_2_words (junction table)
+----+-------+-------+
| id | word1 | word2 |
+----+-------+-------+
|  1 |     1 |     2 |
+----+-------+-------+

查找 house 的所有同义词相当容易:

SELECT * FROM words_2_words WHERE word1 = 1;

但是,为了确保,我还找到了仅在“word2”列中列出的单词,我实际上需要 2 个查询:

SELECT *, word2 AS synonym FROM words_2_words WHERE word1 = 1;
SELECT *, word1 AS synonym FROM words_2_words WHERE word2 = 1;

如何将这 2 个查询放在一个查询中以获得更快的结果?

4

2 回答 2

1

如果我理解你所说的正确,你只需运行:

select * from words_2_words where word1 = 1 or word2 = 1

尽管您使用联合来组合 2 个查询,但这似乎并不是您真正需要做的。

于 2014-02-18T23:22:43.867 回答
1

你可以使用IN

SELECT CASE WHEN Word1 = 1 THEN Word2 ELSE Word1 END AS Word
FROM words_2_words
WHERE 1 IN (Word1, Word2):

或联合:

SELECT Word2 AS Word
FROM words_2_words
WHERE Word1 = 1
UNION [ALL]
SELECT Word1
FROM words_2_words
WHERE Word2 = 1;

添加或删除[ALL]取决于您是否想要不同的结果。


为了得到实际的话,我建议只加入两次,然后你可以把两个词都说出来:

SELECT CASE WHEN w2w.Word1 = $id THEN w2.Word ELSE w1.Word END AS Word
FROM    words_2_words w2w
        INNER JOIN words w1
            ON w2w.word1 = w1.id
        INNER JOIN words w2
            ON w2w.word2 = w2.id
WHERE   $id IN (w2w.Word1, w2w.Word2):

如果您真的不想这样做,您可以在连接中使用相同的 case 语句:

SELECT  w.Word
FROM    words_2_words w2w
        INNER JOIN words w
            ON CASE WHEN w2w.Word1 = $id THEN w2w.Word2 ELSE w2w.Word1 END = w.id
WHERE   $id IN (w2w.Word1, w2w.Word2):
于 2014-02-18T23:25:34.663 回答