加入三个表MySQL在哪里

时间:2017-12-19 18:59:02

标签: mysql join where

首先,我意识到还有其他类似的问题,我已经阅读了其中许多问题,我无法弄清楚这一点。

我有三张桌子。

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";

这返回了数以千计的无关答案。我不确定最好的方法。任何帮助将不胜感激。

3 个答案:

答案 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";

这将获取以下结果

enter image description here

正如你已经完成了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