Si no quieres sobrecargar el servidor de base de datos, creo que definitivamente sera necesario rediseñar tus tablas (y la programacion).
Por ejemplo, en fondos, no es necesario que tengas el nombre o descripcion de categoria o subcategoria, es preferible solo la ID (el resto de info lo obtendrias mediante JOIN) y no requieres dos tablas para categoria y subcategoria, basta con una sola, donde si el padre es 0, entonces se trata de una categoria y si es mayor que cero se trata de una subcategoria.
De esta forma, harias una consulta a 1 sola tabla de categorias, obteniendo la ID de las que coincidan con los terminos de busqueda y despues buscar en fondos con dos condiciones:
categoria IN (lista de categorias) OR nombre LIKE '%terminos de busqueda%'
Podrias almacenar los resultados en una matriz, ordenandolos por nombre de fondo o por categoria / subcategoria y despues recorrer esa matriz para presentar los resultados en el orden que prefieras.
Ejemplo de tablas:
Código SQL:
Ver originalCREATE TABLE IF NOT EXISTS `fondos` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`nombre` VARCHAR(256) DEFAULT NULL,
`nombre_corto` VARCHAR(256) DEFAULT NULL,
`fecha` VARCHAR(100) DEFAULT NULL,
`categoria` INT(11) DEFAULT NULL,
`visible` INT(11) DEFAULT '1',
`visitas` INT(11) DEFAULT '1',
`descargas` INT(11) DEFAULT '1',
`autor` INT(11) DEFAULT NULL,
`resolucion` VARCHAR(256) DEFAULT NULL,
`remitente` INT(11) DEFAULT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE IF NOT EXISTS `categorias` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`nombre` VARCHAR(256) DEFAULT NULL,
`nombre_corto` VARCHAR(256) DEFAULT NULL,
`padre` INT(11) DEFAULT 0,
`icono` VARCHAR(100) DEFAULT NULL,
`meta_title` VARCHAR(256) DEFAULT NULL,
`meta_keywords` VARCHAR(256) DEFAULT NULL,
`meta_description` VARCHAR(256) DEFAULT NULL,
PRIMARY KEY (`id`)
);