Соединение SQL через денормализованную таблицу - каков синтаксис выбора? - PullRequest
0 голосов
/ 17 октября 2011

У меня возникли проблемы с запоминанием запросов к базе данных - это было давно: (

Допустим, у меня есть несколько таблиц:

WORDS {ID, WORD}
FILES {ID, URL}
FILES_WORDS {WORDID, FILEID, COUNT}

СЛОВА и ФАЙЛЫ имеют именованные ИД PK и строку для их слова / пути соответственно. FILES_WORDS денормализует отношение «многие ко многим» и содержит количество раз, которое каждое слово появилось в каждом файле.

Я знаю, что могу выбрать информацию для данного файла следующим образом:

SELECT FILES.URL, WORDS.WORD, FILES_WORDS.COUNT FROM WORDS, FILES, FILES_WORDS
    WHERE FILES_WORDS.FILEID = FILES.ID AND FILES_WORDS.WORDID = WORDS.ID AND
    IFILE.ID = 1;

Я уверен, что есть более чистый синтаксис с использованием объединений и тому подобного, хотя у меня возникают проблемы с поиском в Google или запоминанием. Кто-нибудь может помочь ускорить / очистить это?

Ответы [ 4 ]

2 голосов
/ 17 октября 2011

Я думаю, вы ищете что-то вроде этого:

SELECT F.URL, W.WORD, FW.COUNT 
FROM WORDS W
  INNER JOIN FILES_WORDS FW
    ON FW.WORDID = W.ID
  INNER JOIN FILES F
    ON FW.FILEID = F.ID
WHERE FW.FILEID = 1;

Но это не обязательно быстрее. Зависит от объема, индексов и т. Д.

Я использовал псевдонимы (однобуквенное прозвище для таблицы), потому что за ним легче следовать, и я не думаю, что вам нужны оба соединения, но это также зависит от того, что вы пытаетесь сделать.

1 голос
/ 17 октября 2011
SELECT FILES.URL, WORDS.WORD, FILES_WORDS.COUNT 
FROM WORDS INNER JOIN FILES_WORDS ON WORDS.ID = FILES_WORDS.WORDID
          LEFT JOIN FILES ON FILES_WORDS.FILEID = FILES.ID

Отметьте все, что вы хотите запросить

IFILE.ID = 1;
0 голосов
/ 17 октября 2011

Вот запрос-

SELECT FILES.URL, WORDS.WORD, FILES_WORDS.COUNT 
FROM WORDS W
Join FILES_WORDS WF
  on W.ID = WF.WORDID
Join FILES F
  on F.ID = FW.FILEID 
Where F.ID = 1;
0 голосов
/ 17 октября 2011

Попробуйте:

SELECT f.URL, w.WORD, fw.COUNT
FROM words w INNER JOIN files_words fw 
  ON f.id = fw.fileid
INNER JOIN words w
  ON fw.wordid = w.id
WHERE f.id = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...