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

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]

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

Фанат

oncle terrible
Команда форума
мда, структуру тут не поменять. во всяком случае, сделана она на первый взгляд грамотно.

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

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

spiner

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

-~{}~ 23.11.05 12:32:

а может есть какие-нибудь идеи выводить всю таблицу, которую получена union по релевантности? может записывать во временную таблицу полученный cid и еще одно поле с числом релевантности.. а потом вывести?
 

spiner

Новичок
alpine
и что? там поставлена точка на том, что надо использовать UNION..
Что мне оттуда черпать?
 

alpine

Новичок
spiner
Это тебе уже решать. Тема обсуждалась, других решений никто не предложил.
 

alexhemp

Новичок
spiner

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

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