Мне удалось создать хранимую процедуру на основе предоставленной вами структуры, которая возвращает идентификатор компании из строки. Это немного сложно, и может потребоваться, чтобы другие просмотрели его, но, похоже, оно дает правильные результаты.
DELIMITER $$
DROP PROCEDURE IF EXISTS sp_build_query $$
CREATE PROCEDURE sp_build_query(IN userquery VARCHAR(100))
BEGIN
DECLARE no_more_rows BOOLEAN;
DECLARE rname VARCHAR(50);
DECLARE fullsql VARCHAR(1000);
DECLARE ratio_cur CURSOR FOR SELECT ratio_name FROM ratios;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET no_more_rows = TRUE;
SET fullsql = userquery;
OPEN ratio_cur;
FETCH ratio_cur INTO rname;
rnamewhile: WHILE rname is not null DO
IF INSTR(fullsql, rname) > 0 THEN
SET fullsql = REPLACE(fullsql, rname, CONCAT(' (SELECT `value` FROM companies_ratios INNER JOIN ratios ON companies_ratios.ratio_id = ratios.id WHERE ratios.ratio_name = ''', rname , ''' AND companies_ratios.company_id = cr.company_id ) '));
END IF;
FETCH ratio_cur INTO rname;
IF no_more_rows THEN
CLOSE ratio_cur;
LEAVE rnamewhile;
END IF;
END WHILE rnamewhile;
SET @finalsql = CONCAT('SELECT company_id FROM companies_ratios cr WHERE ', fullsql , ' GROUP BY cr.company_id;');
PREPARE stmt1 FROM @finalsql;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END$$
Для создания запроса я использовал следующие веб-сайты. Они должны быть в состоянии объяснить функции немного подробнее, но в основном он просматривает таблицу отношений и, когда он находит имя отношения в пользовательском запросе, заменяет его оператором выбора. Результирующий оператор объединяется в конце, чтобы создать ваш последний оператор выбора, который затем выполняется, предоставляя список уникальных идентификаторов компании.
Выполнить STRING как запрос - Динамический SQL -> ПОДГОТОВИТЬ
http://forums.mysql.com/read.php?60,27979,30437
Форумы MySQL :: Хранимые процедуры :: Учебник по хранимым процедурам MySQL
http://forums.mysql.com/read.php?98,358569,358569
MySQL Cursors
http://dev.mysql.com/doc/refman/5.0/en/cursors.html
Цикл в хранимых процедурах
http://www.mysqltutorial.org/stored-procedures-loop.aspx
Курсор SQL в хранимых процедурах
http://www.mysqltutorial.org/sql-cursor-in-stored-procedures.aspx
Синтаксис SQL для подготовленных операторов
http://dev.mysql.com/doc/refman/5.1/en/sql-syntax-prepared-statements.html
CREATE PROCEDURE и CREATE FUNCTION Синтаксис
http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html