Количество соединений MySQL из одной таблицы с идентификаторами из другой - PullRequest
2 голосов
/ 25 ноября 2011

У меня есть две таблицы, которые составляют полнотекстовый индекс содержимого статьи для целей поиска.Одна из таблиц - это просто первичный ключ, связанный со словом, тогда как в другой записывается статья, в которой он встречался, и его местоположение в документе.Одно и то же слово может появляться много раз в одном и том же документе с разными местоположениями, поэтому один и тот же идентификатор слова может встречаться несколько раз в таблице word_locations.

Вот структуры:

words:

id          bigint
word        tinytext

word_location:

id          bigint(20)  
wordid      bigint(20)  
location    int(11) 
article_id  int(11)

Мне нужно написать запрос, который найдет количество вхождений для каждого слова в любом профиле.Мне нужно сохранить нулевое значение для слов, которые вообще не появляются, поэтому я предполагаю, что это должно быть левое соединение.Однако всякий раз, когда я пытаюсь добавить запрос where для ограничения статьи, любые слова, которые вообще не отображаются, не включаются в набор результатов.

Я пробовал:

select words.wordid, COUNT(word_location.wordid) as appears from words left join word_location on word.id = word_location.wordid where article_id = %s GROUP BY wordid

Но этот запрос не возвращает нули для слов, которые вообще не появляются.

Как изменить это левое объединение?

Заранее спасибо!

EDIT :

Вот пример набора данных и наборов результатов для различных запросов.

Пример содержимого статьи:

Ресторан Боба одиниз лучших ресторанов в Большом округе, где вы можете насладиться лучшими блюдами турецкой кухни.

Таким образом, таблица словаря, после корректировки приложением для исключения стоп-слов, будет иметь в своих словарных строках значение Bob, Restaurant, finest, greater, county, enjoy, Turkish и cusine.(Я использую эту настоящую статью, поскольку она является первой в наборе, поэтому идентификаторы на самом деле появляются начиная с целого числа 1.

Запрос, предоставленный @Mark Bannister, производит такой набор результатов: wordid - word - occurances:

128 clifton 0
1   bob's   2
2   restaurant  2
3   one 1
4   finest  3
5   restaurants 2
6   greater 1
9   county  1
12  enjoy   3
13  turkish 6
14  cuisine 1

Результирующий набор сам по себе правильный - но идентификатор 128 вообще не появляется в документе и является единственной вещью в результирующем наборе с появлением 0. Цель состоит в том, чтобы иметь весь словарьвозвращено с числом вхождений в документе (это примерно 2500 разных слов)

Мой оригинальный проблемный запрос до редактирования, приведенного выше, фактически возвратил тот же набор результатов, но без ЛЮБЫХ 0 строк вхождения.

Ответы [ 3 ]

3 голосов
/ 25 ноября 2011

Вы должны включить ваш выбор статьи в ваше условие присоединения:

select words.wordid, COUNT(word_location.wordid) as appears 
from words 
left join word_location on word.id = word_location.wordid and article_id = ? 
GROUP BY wordid

Включение ограничения article_id в предложение WHERE фактически превращает ваше левое соединение во внутреннее соединение.

1 голос
/ 25 ноября 2011

Я бы использовал подвыбор вместо объединения.

SELECT words.id, (SELECT count(*) FROM word_location WHERE word_location.wordid = words.id) as appears
0 голосов
/ 25 ноября 2011

Это немного догадка, но я думаю, что COUNT () просто игнорирует ваши нули, а не подсчитывает их и достигает 0. (NULL + NULL! = 0)

Посмотрите на функцию IFNULL (), вы можете сделать что-то вроде:

COUNT(IFNULL(word_location.wordid, 0))

(Отказ от ответственности - я более привык к функции NVL (,) Oracle, поэтому это немного умозрительно!)

...