Помогите составить сложный запрос или поправить структуру БД

  • Автор темы Автор темы spiner
  • Дата начала Дата начала

spiner

Новичок
Помогите составить сложный запрос или поправить структуру БД

Смысл БД:
есть таблица фирм:
[SQL]
CREATE TABLE `clients` (
`cid` int(11) NOT NULL default '0',
`name` varchar(250) default NULL,
`inf` text,
PRIMARY KEY (`cid`),
FULLTEXT KEY `index` (`name`,`inf`)
) TYPE=MyISAM;
[/SQL]
есть таблица занятий (чем занимаются фирмы):
[SQL]
CREATE TABLE `sub_parts` (
`id_sub` smallint(6) NOT NULL default '0',
`name_sub` varchar(250) NOT NULL default '',
PRIMARY KEY (`id_sub`),
FULLTEXT KEY `sub_parts` (`name_sub`)
) TYPE=MyISAM;
[/SQL]

есть таблица соответствий этих таблиц (одна фирма может заниматься многими занятиями И одним занятием может заниматься много фирм) СВЯЗЬ: много - много:

[SQL]
CREATE TABLE `cp` (
`cid` int(11) NOT NULL default '0',
`id_sub` smallint(6) NOT NULL default '0'
) TYPE=MyISAM;
[/SQL]
Вопросы:
правильная ли структура?
мне надо осуществить поиск в таблицах clients и sub_parts слова $key по полнотекстовым индексам и вывести несовпадающие cid..
я хотел сделать так:
ссылка
А точнее сделать через UNION, сделал - работает, но сказали что это криво((:
[SQL]
(SELECT clients.cid from clients where MATCH (name,inf) AGAINST ('$key')
) union (select cp.cid from sub_parts join cp on (sub_parts.id_sub=cp.id_sub) where match (sub_parts.name_sub) AGAINST ('$key'))
[/SQL]

Что не так?
Как мне лучше сделать.. Готов поменять структуру, т.к. база почти не заполнена..
 
мда, структуру тут не поменять. во всяком случае, сделана она на первый взгляд грамотно.

просто в таблице, которую ты будешь получать юнионом, нету индексов. и сортировать её, к примеру, будет очень накладно.

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

-~{}~ 23.11.05 12:32:

а может есть какие-нибудь идеи выводить всю таблицу, которую получена union по релевантности? может записывать во временную таблицу полученный cid и еще одно поле с числом релевантности.. а потом вывести?
 
alpine
и что? там поставлена точка на том, что надо использовать UNION..
Что мне оттуда черпать?
 
spiner
Это тебе уже решать. Тема обсуждалась, других решений никто не предложил.
 
spiner

Я бы предложил использовать внешний индексатор. Т.е. поиск не средствами mySQL а прикрутить mnogosearch или dpSearch.

Если данные выводятся на HTML страницы то внешний индексатор вообще элементарно настроить.
 
Сверху