Как правильно составить запрос - MySQL
Формулировка задачи:
Есть три таблицы:
Мне нужно выбрать сайт ramfish.ru из таблицы domains в подзапросе.
Основной запрос идет в таблицу jobs, потом по полю из этой таблицы group_obj_id в подзапросе получаем поле table_dt (у которого значение domains) и это значение domains послужит значением таблицы для подзапроса который вернет уже поле name_dt (у которого значение ramfish.ru)
Вот я сделал запрос:
select SQL_CALC_FOUND_ROWS num_dt as num_line, (select name_dt from (select table_dt from group_obj where num_dt=t.group_obj_id limit 1) as t1 where num_dt=t.obj_id limit 1) as obj_dt from jobs as t order by num_dt LIMIT 0, 100
но он не работает, выдает Column not found: 1054 Unknown column 't.group_obj_id' in 'where clause''
Помогите пожалуйста правильно составить запрос.
select * from jobs; +--------+----------+------------------+-------------+-------------+--------------+--------+------------+----------+ | num_dt | num_sort | status_dt | exchange_dt | name_dt | group_obj_id | obj_id | date_dt | time_dt | +--------+----------+------------------+-------------+-------------+--------------+--------+------------+----------+ | 2 | 1 | работает | 0 | delete_site | 2 | 4 | 2016-09-14 | 01:10:30 | +--------+----------+------------------+-------------+-------------+--------------+--------+------------+----------+
select * from group_obj; +--------+----------------+----------+ | num_dt | name_dt | table_dt | +--------+----------------+----------+ | 1 | Сервера | servers | | 2 | Домены | domains | | 3 | Темы | thems | +--------+----------------+----------+
select * from domains; +--------+------------+-----------+ | num_dt | name_dt | server_id | +--------+------------+-----------+ | 4 | ramfish.ru | 13 | | 5 | site-1.ru | 14 | +--------+------------+-----------+
Решение задачи: «Как правильно составить запрос»
textual
Листинг программы
DELIMITER $$
CREATE
FUNCTION `baza`.`object`(group_obj_id INT, obj_id INT) RETURNS VARCHAR(100)
BEGIN
DECLARE result VARCHAR(100);
DECLARE obj_table VARCHAR(100);
DECLARE query_string VARCHAR(300);
SELECT table_dt INTO obj_table FROM group_obj WHERE num_dt=group_obj_id;
SET @query_string := CONCAT('SELECT name_dt INTO result FROM ', obj_table, ' WHERE num_dt=obj_id');
PREPARE dinamic_query FROM @query_string;
EXECUTE dinamic_query;
DEALLOCATE PREPARE dinamic_query;
RETURN(result);
END$$
DELIMITER ;
Объяснение кода листинга программы
- В данном коде создается функция с именем
object, которая принадлежит базе данныхbaza. - Функция принимает два параметра:
group_obj_idиobj_id. group_obj_idпредставляет собой идентификатор объекта в группе, аobj_id- идентификатор объекта.- Функция возвращает строку (
VARCHAR(100)) с результатом. - Внутри функции определены четыре переменные:
result(результат запроса)obj_table(имя таблицы, содержащей объекты)query_string(строка с динамическим запросом)@query_string(переменная для хранения строки запроса)
- Сначала выполняется запрос SELECT для определения имени таблицы, соответствующей
group_obj_id. Результат сохраняется в переменнойobj_table. - Затем формируется строка запроса с использованием функции CONCAT. Строка запроса включает имя таблицы, полученное на предыдущем шаге, и фильтр
WHERE num_dt=obj_id. - Строка запроса сохраняется в переменной
@query_string. - Создается подготовленный запрос
dinamic_queryиз строки@query_string. - Выполняется подготовленный запрос
dinamic_query. - Запрос освобождается с помощью
DEALLOCATE PREPARE dinamic_query;. - Результат запроса сохраняется в переменной
result. - Функция возвращает значение переменной
result. Список элементов кода: - Создание функции
object - Определение переменных
result,obj_table,query_string,@query_string - Выполнение запроса SELECT для определения имени таблицы
- Формирование строки запроса с использованием функции CONCAT
- Создание подготовленного запроса
dinamic_query - Выполнение подготовленного запроса
dinamic_query - Освобождение подготовленного запроса
dinamic_query - Возврат значения переменной
result