Как правильно составить запрос - MySQL

Узнай цену своей работы

Формулировка задачи:

Есть три таблицы:
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 |
+--------+------------+-----------+
Мне нужно выбрать сайт 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'' Помогите пожалуйста правильно составить запрос.

Решение задачи: «Как правильно составить запрос»

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 ;

Объяснение кода листинга программы

  1. В данном коде создается функция с именем object, которая принадлежит базе данных baza.
  2. Функция принимает два параметра: group_obj_id и obj_id.
  3. group_obj_id представляет собой идентификатор объекта в группе, а obj_id - идентификатор объекта.
  4. Функция возвращает строку (VARCHAR(100)) с результатом.
  5. Внутри функции определены четыре переменные:
    • result (результат запроса)
    • obj_table (имя таблицы, содержащей объекты)
    • query_string (строка с динамическим запросом)
    • @query_string (переменная для хранения строки запроса)
  6. Сначала выполняется запрос SELECT для определения имени таблицы, соответствующей group_obj_id. Результат сохраняется в переменной obj_table.
  7. Затем формируется строка запроса с использованием функции CONCAT. Строка запроса включает имя таблицы, полученное на предыдущем шаге, и фильтр WHERE num_dt=obj_id.
  8. Строка запроса сохраняется в переменной @query_string.
  9. Создается подготовленный запрос dinamic_query из строки @query_string.
  10. Выполняется подготовленный запрос dinamic_query.
  11. Запрос освобождается с помощью DEALLOCATE PREPARE dinamic_query;.
  12. Результат запроса сохраняется в переменной result.
  13. Функция возвращает значение переменной result. Список элементов кода:
  14. Создание функции object
  15. Определение переменных result, obj_table, query_string, @query_string
  16. Выполнение запроса SELECT для определения имени таблицы
  17. Формирование строки запроса с использованием функции CONCAT
  18. Создание подготовленного запроса dinamic_query
  19. Выполнение подготовленного запроса dinamic_query
  20. Освобождение подготовленного запроса dinamic_query
  21. Возврат значения переменной result

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.333 из 5