我知道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;
如何将这两个查询放在一个查询中以获得更快的结果?
答案 0 :(得分:1)
如果我理解你所说的正确,你就会跑:
select * from words_2_words where word1 = 1 or word2 = 1
虽然您使用联合组合了2个查询,但这似乎不是您实际需要做的。
答案 1 :(得分:1)
您可以使用IN
:
SELECT CASE WHEN Word1 = 1 THEN Word2 ELSE Word1 END AS Word
FROM words_2_words
WHERE 1 IN (Word1, Word2):
或UNION:
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):