Как правильно составить запрос - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д