Аналог IN для LIKE или реально это сделать одним запросом?

Духовность™

Продвинутый новичок
Аналог IN для LIKE или реально это сделать одним запросом?

Привет.

Одним запросом я выбираю все статьи, в которых ключевые слова совпадают с искомыми.
Так:

PHP:
....
... WHERE word IN ('путен', 'ктулху', 'моск')
...
Соответственно, есть таблица статей, ключевых слов и таблица связи между ними.


Теперь мне нужно одним запросом выбрать статьи, в заголовках которых есть одно из слов, перечисленных в константах ('путен', 'ктулху', 'моск').

но как это можно сделать? и возможно ли? :confused:
 

Духовность™

Продвинутый новичок
*****
как? создать SQL-запрос для WHERE где тупо сделать N количество строк

PHP:
" article_header LIKE %".$word."% OR "
??
 

Gas

может по одной?
triumvirat
1. слова из заголовков тоже должны быть в таблице со словами из статей, но в таблице связей можно добавить поле "вес" и если слово есть в заголовке вес больше, если только в теле - меньше. При выборке учитывать вес для лучшей релеватности.
2. Использовать fulltext - лучше чем 1-ый вариант.
3. Использовать sphinx.

о like '%...' для поиска на сайте вообще лучше забудь.
 

Gas

может по одной?
потому что like '%string' - это очень медленно.
Лучше сразу делай c помощью fulltext, просто и достаточно эффективно.
 

Gas

может по одной?
:)
тебе шашечки или ехать ?
приемлемых вариантов не так много:
1. таблица слов и связей с текстами - самый ущербный в плане функциональности вариант
2. mysql fulltext
3. специализированный поисковый движёк: sphinx, lucene, mnogosearch и т.д..

скорее всего это не весь возможный набор, но like и regexp в него точно никаким боком не попадают.
 

fixxxer

К.О.
Партнер клуба
если у тебя три с половиной статьи, делай like и не парься
 

Духовность™

Продвинутый новичок
fixxxer
статей будет туева хуча, я разрабатываю крутую газету!

Gas
за fulltext благодарю. то што надо.

-~{}~ 20.12.07 16:11:

Господа! Один вопрос.

Сделал:

PHP:
ALTER TABLE articles ADD  FULLTEXT (article_header, article_text)
потом сделал экспорт структуры. Что вижу:

PHP:
CREATE TABLE `articles` (
  .......
  FULLTEXT KEY `article_header` (`article_header`,`article_text`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=49 ;
Я не понял - а почему так странно обозначен FULLTEXT? Почему `article_header`два раза повторяется??
 

Gas

может по одной?
сначала имя индекса, потом его поля.
Газетке конечно не повезло, но нужно на чём-то опыта набираться :)
 

Духовность™

Продвинутый новичок
а как правильно иддекс сделать?

так:

PHP:
CREATE FULLTEXT INDEX article_header 
        ON articles  (article_header);

CREATE FULLTEXT INDEX article_text 
        ON articles  (article_text);
или так:

PHP:
CREATE FULLTEXT INDEX my_index 
        ON articles  (article_header, article_text));
 

hammet

Новичок
FULLTEXT KEY `имя_индекса` (его_поля)


ALTER TABLE `table` ADD FULLTEXT `name` (`field` ( 100 ) )
 

Духовность™

Продвинутый новичок
у меня 2 мануала под рукой, не надо мне ссылки давать.

я создал 2 индекса:

ALTER TABLE articles ADD FULLTEXT KEY(article_header)
ALTER TABLE articles ADD FULLTEXT KEY(article_text)

при запросе MySQL выдал:

Can't find FULLTEXT index matching the column list:

хотя индексы созданы. Я так понимаю, что при поиске

MATCH (article_header, article_text) AGAINST (...)

нужно создавать индекс сразу на два столбца?
 

Духовность™

Продвинутый новичок
Gas
спасибо! :)

-~{}~ 20.12.07 16:45:

Я создал так:

PHP:
ALTER TABLE articles ADD  FULLTEXT `search` (article_header, article_text)

ALTER TABLE news ADD  FULLTEXT `search` (news_header, news_text)
- это правильно?
 

Gas

может по одной?
да правильно, если есть несколько способов сделать одно и то-же действие, это не значит что только один из них - истинно верный, они могут быть все правильные (я о alter table и create index).
посмотреть правильно или нет можно, например, командой show create table `table`;
 
Сверху