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

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

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

Есть три таблицы:
Листинг программы
  1. select * from jobs;
  2. +--------+----------+------------------+-------------+-------------+--------------+--------+------------+----------+
  3. | num_dt | num_sort | status_dt | exchange_dt | name_dt | group_obj_id | obj_id | date_dt | time_dt |
  4. +--------+----------+------------------+-------------+-------------+--------------+--------+------------+----------+
  5. | 2 | 1 | работает | 0 | delete_site | 2 | 4 | 2016-09-14 | 01:10:30 |
  6. +--------+----------+------------------+-------------+-------------+--------------+--------+------------+----------+
Листинг программы
  1. select * from group_obj;
  2. +--------+----------------+----------+
  3. | num_dt | name_dt | table_dt |
  4. +--------+----------------+----------+
  5. | 1 | Сервера | servers |
  6. | 2 | Домены | domains |
  7. | 3 | Темы | thems |
  8. +--------+----------------+----------+
Листинг программы
  1. select * from domains;
  2. +--------+------------+-----------+
  3. | num_dt | name_dt | server_id |
  4. +--------+------------+-----------+
  5. | 4 | ramfish.ru | 13 |
  6. | 5 | site-1.ru | 14 |
  7. +--------+------------+-----------+
Мне нужно выбрать сайт 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
Листинг программы
  1. DELIMITER $$
  2. CREATE
  3.     FUNCTION `baza`.`object`(group_obj_id INT, obj_id INT) RETURNS VARCHAR(100)
  4.     BEGIN
  5.     DECLARE result VARCHAR(100);
  6.     DECLARE obj_table VARCHAR(100);
  7.     DECLARE query_string VARCHAR(300);
  8.     SELECT table_dt INTO obj_table FROM group_obj WHERE num_dt=group_obj_id;
  9.     SET @query_string := CONCAT('SELECT name_dt INTO result FROM ', obj_table, ' WHERE num_dt=obj_id');
  10.     PREPARE dinamic_query FROM @query_string;
  11.     EXECUTE dinamic_query;
  12.     DEALLOCATE PREPARE dinamic_query;
  13.     RETURN(result);
  14.     END$$
  15. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут