Индексный поиск и логика "И"

Daos

Новичок
Индексный поиск и логика "И"

Есть таблица:

------------------
| postid | wordid |
------------------
|    1    |     1     |
|    1    |     2     |
|    1    |     3     |
|    2    |     1     |
|    2    |     3     |
|    3    |     1     |
|    4    |     1     |
|    4    |     3     |


Задача выбрать те postid у которых wordid равны 1 И 3,
то есть в этом примере результат дожен быть postid 1,2,4

Как это лучше сделать?
 

Фанат

oncle terrible
Команда форума
Стандартное заблуждение.
Если тебе нужно получить в ответе 1 И 3, то в запросе у тебя должно быть указано, что тебе нужны записи, отвечающие условию
поле равно 1 ИЛИ поле равно 3

вот и все
 

Daos

Новичок
Нет друзья, всё не так просто, если запрос с ИЛИ то в него попадает и postid 3, что не верно!!! Ведь задача чёткое "И"

Фанат прав, ИЛИ (OR) здесь не годится!
 

Demiurg

Guest
select postid , count(wordid) cnt
from table where wordid = 1 or wordid=3
group by postid
having cnt = 2
 

Daos

Новичок
Да что то похожее на это, надо проверить. А не будет ли такой запрос притормаживать значиьтельно? Ведь индекс будет очень большим, около 1 мил. записей
 

Demiurg

Guest
скорее все все будет зависить от количества записей без having.
 

Daos

Новичок
А есть ли способ оптимизировать это без having? Может разбирать эту логику в php, то есть запрашивать всю кучу (по OR) а потом анализировать? Или может всё таки есть способ средставами мускула как то обойтись?
 

Фанат

oncle terrible
Команда форума
Нет друзья, всё не так просто, если запрос с ИЛИ то в него попадает и postid 3, что не верно!!! Ведь задача чёткое "И"
раз я прав, то ПРОЧТИ МОЕ СОБЩЕНИЕ ВНИМАТЕЛЬНО.

у меня там написано, что поставленному тобой условию соотвествтует запрос, который написал Demiurg, причем объяснено - почему.

испоользуй, и не привередничай.
 

Demiurg

Guest
на php ты ничего не оптимизируешь. Да и вобще оптимизировать надо исходя из реальных задач. А ты дал только пример.
 

Daos

Новичок
Фанат, в таком случае я объяснил почему первый приведённый Demiurg'ом запрос не годится. Вот второй запрос действительно подходит.

Demiurg, Это поисковый механизм, то есть при вводе в поисковый запрос словосочетаний, должны искаться сообщения в которых есть всё слова из запроса (И). Индекс будет очень большим хотя он ессно проиндексирован. И ещё запросы будут не только в два слова, но и в три, четыре и т.д., это тоже надо учитывать, что скажешь?
 

Wicked

Новичок
Daos, уж не full-text поисковик с помощью php/mysql/ispell пишешь ? :))))

Если да могу поделиться соображениями во аське 3611007.

сам написал подобный движок для энциклопедических словарей, который в 100 мбайтах плэинтекста (200000 статей) в среднем ищет за 5-10 секунд.
Запрос типа <"средства коммуникации" технология> - 7 секунд с результатом 460 статей.
Запрос типа <"российская федерация"> - 9 секунд, 2700 статей.
Запрос типа <российская федерация> - 4 секунды, 11000 статей.

При этом учитывается морфология, нечеткий поиск (когда некоторое нормированное кол-во слов запроса может отсутсвовать) и нечеткий порядок (когда между словами может вклиниваться нормированное кол-во слов не из запроса).
 
Сверху