Отфильтровать результат

Отфильтровать результат

Добрый день!

Мучаюсь над большим запросом, но по сути не могу потять как реализовать следущее
Существует таблица words с полями id, id_item, word

Запросом:
SELECT * FROM words WHERE "word"="москва" OR "word"="парк"

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

Что нужно сделать чтобы в результате были только записи которые содержат ОБА слова?
Причем 2 слова в запросе не предел.
 

alpine

Новичок
Смирнов Андрей
Я так понимаю что нужно что-то типа:
[sql]
SELECT DISTINCT id FROM words w1 INNER JOIN words w2 ON(w1.id=w2.id) WHERE w1.`word`='москва' AND w2.`word`='парк'
[/sql]
* - где id - ИД некого текстового поля в котором встречаются искомые слова.
 

Raul

Новичок
Re: Отфильтровать результат

Автор оригинала: Смирнов Андрей
SELECT * FROM words WHERE "word"="москва" OR "word"="парк"
причем некоторые id_item содержат и то и другое слово.
Сорри, а вы не обманываете?
 
2 440hz
Это простенький поиск.
запись не может содержать сразу два слова и соответственно AND не подойдет.

2 alpine
Попытался попробовать Ваш запрос, но возвращается какойто бред.
Давайте разберемся:
id не причем так как это типа счетчик Ж)
INNER JOIN words w2 ON ( w1.id = w2.id ) умножает таблицу на себя? Мы имеем больше таких же данных?
 

alpine

Новичок
Я же это кому писал:
* - где id - ИД некого текстового поля в котором встречаются искомые слова.
-~{}~ 17.10.06 13:52:

Запрос кстати можно переписатьи так:
[sql]
SELECT id_item FROM words WHERE word IN('some_word1', 'some_word2') GROUP BY id_item HAVING COUNT(id_item)=2
[/sql]
но он видимо будет тормозный.
 

440hz

php.ru
запись не может содержать сразу два слова и соответственно AND не подойдет.
можно тогда сформулировать условия поиска словами?

например:
найти все тексты содержащие слово "москва" и не содержащие "парк"
или
найти все тексты содержащие слово "москва" и слово "парк"

или как оно вообще? а когда слов будет пять?
 
alpine БРАВО!

SELECT DISTINCT w1.id_item
FROM words w1
INNER JOIN words w2 ON ( w1.id_item = w2.id_item )
WHERE w1.word = 'москва'
AND w2.word = 'парк'

Сработал, как надо.
Только например если таких слов будет пять? Это что
[SQL]
SELECT DISTINCT w1.id_item
FROM words w1
INNER JOIN words w2 ON ( w1.id_item = w2.id_item )
INNER JOIN words w3 ON ( w1.id_item = w3.id_item )
INNER JOIN words w4 ON ( w1.id_item = w4.id_item )
INNER JOIN words w5 ON ( w1.id_item = w5.id_item )
WHERE w1.word = 'москва'
AND w2.word = 'парк'
AND w3.word = 'парк'
AND w4.word = 'парк'
AND w5.word = 'парк'
[/SQL]
по моему неправильно написал...Ж(

Нет ли другого способа?
[SQL]
SELECT id_item
FROM words
WHERE word
IN (
'some_word1', 'some_word2'
)
GROUP BY id_item
HAVING COUNT( id_item ) = 2
[/SQL]
тоже работает, но как Вы сами
сказали тормозной.
 

chira

Новичок
alpine
если id - Primary Key, то правильнее в твоём примере
...
INNER JOIN words w2 ON ( w1.id_item = w2.id_item )
...

а если учесть, что слов может быть больше двух, то:
Код:
SELECT id_item
FROM words 
WHERE word IN ('москва','парк','брумфильд')
GROUP BY id_item
HAVING COUNT(DISTINCT word) = 3
-~{}~ 17.10.06 14:21:

долго сочинял ...
 

440hz

php.ru
ИМХО я бы все-таки попробовал восползоваться FULLTEXT поиском. и хлопот меньше и результаты лучше.
 

chira

Новичок
Смирнов Андрей
SQL:SELECT id_item
FROM words
WHERE word
IN (
'some_word1', 'some_word2'
)
GROUP BY id_item
HAVING COUNT( id_item ) = 2
тоже работает, но как Вы сами
сказали тормозной.
здесь можно попробовать два составных индекск
id_item,word или
word,id_item
используй, какой больше подойдёт ...
 
Спасибо всем!
Выбрал

SELECT id_item
FROM words
WHERE word
IN (
'some_word1', 'some_word2'
)
GROUP BY id_item
HAVING COUNT( id_item ) = 2

потому что группировку все равно надо делать.
А с ключами попробую, наверное буду использовать id_item
 

chira

Новичок
COUNT( id_item ) = 2
будет работать если сочетание id_item,word уникальное ...
если для одного id_item может быть две записи с одним значение word, то получишь неверный результат
 
Да, спасибо!

Слава богу, это не допускается при заполнении.

А использовать JOIN боязно, в основном запросе (который не расспатривался их уже два).

Кто бы порекомендовал литературку по JOIN для MySQL.... а то на уровне подсознания понимаю, а что это такое точно нет. Ж)
 
Сверху