Во-первых, я понимаю, что есть другие подобные вопросы, я прочитал многие из них, и я не могу понять это.
У меня есть три таблицы.
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
Таблицу удержания. Таблица 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";
Это вернуло тысячи несвязанных ответов. Я не уверен в лучшем способе сделать это. Любая помощь приветствуется.
Давайте посмотрим на ваш результат запроса, выбрав *. Я использовал "адрес 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";
Я думаю, что порядок таблиц не имеет значения, так как здесь все внутреннее соединение. Я всегда готов исправить себя, если кто-нибудь даст какое-то предложение по этому поводу.
Это должен быть ваш запрос:
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'
Использование:
select u.uri, wl.word
from urilist u
join wordlocation2 wl2 on wl2.uriid = u.id
join wordlist wl on wl2.wordid = wl.rowid