首先,我意识到还有其他类似的问题,我已经阅读了其中许多问题,我无法弄清楚这一点。
我有三张桌子。
urilist
----------------
rowid | uri
1000 xyz
1001 abc
1002 cde
1003 fgh
wordlist
----------------
rowid | word
1 word1
2 word2
3 word3
4 word4
wordlocation2
----------------
uriid | wordid
1001 1
1001 2
1001 3
1001 4
表a持有uris。表b包含单词。表c是一个查找表,您可以在其中查看与uri关联的每个单词,反之亦然。
我需要为给定的uri返回单词。所以对于uri abc
我需要单词word1,word2,word3,word4
。
这是我最近的尝试。
select word from wordlist join wordlocation2 on wordlist.rowid =
wordlocation2.wordid
left join urilist on wordlocation2.uriid = urilist.rowid
and urilist.uri = "a uri address";
这返回了数以千计的无关答案。我不确定最好的方法。任何帮助将不胜感激。
答案 0 :(得分:2)
让我们通过选择*来查看您的查询结果。我使用了你给出的'一个uri地址'来展示LEFT JOIN
查询:
select * from wordlist join wordlocation2 on wordlist.rowid = wordlocation2.wordid left join urilist on wordlocation2.uriid = urilist.rowid and urilist.uri = "a uri address";
这将获取以下结果
正如你已经完成了wordlocation2 LEFT JOIN urilist,即使urilist没有匹配的行,也会通过将urilist值设为NULL来得到一个值(这就是左连接的含义)。在您的情况下,如果没有匹配的行,则不应获取任何值。因此,使用JOIN而不是LEFT JOIN。
select * from wordlist join wordlocation2 on wordlist.rowid = wordlocation2.wordid join urilist on wordlocation2.uriid = urilist.rowid where urilist.uri = "abc";
我认为表的顺序并不重要,因为这里的所有东西都是内连接。如果有人对此提出一些建议,我随时准备纠正自己。
答案 1 :(得分:0)
这应该是您的查询:
select l.word from urilist u
join wordlocation2 w on w.uriid = u.rowid
join wordlist l on l.rowid = wordid
where u.uri = 'some_uri'
答案 2 :(得分:0)
使用:
select u.uri, wl.word
from urilist u
join wordlocation2 wl2 on wl2.uriid = u.id
join wordlist wl on wl2.wordid = wl.rowid