1 / 1 / 0
Регистрация: 20.02.2012
Сообщений: 13
1

Сбор в один столбец запроса данных из столбцов 2-х разных таблиц.

20.02.2012, 17:04. Показов 9985. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.

Сразу оговорюсь - изменить базу данных не вариант, так как она уже есть и заполнена и работает + это бесплатный проект(GLPI), который должен без вопросов обновляться.

А теперь собственно вопрос. Есть база MySQL система заявок.
Есть 5 таблицы: glpi_tickets (заявки), glpi_computers (компьютеры), glpi_printers (принтеры), glpi_entities (организации), glpi_locations (местонахождение).
Структура таблиц:
1. glpi_tickets: id - номер; title - название; status - статус; itemtype - тип девайса; items_id - идентификатор девайса; entities_id - идентификатор организации.
2. glpi_computers - id - идентификатор; name - имя; locations_id - ID местонахождения.
3. glpi_printers - id - идентификатор; name - имя; locations_id - ID местонахождения.
3. glpi_entities - id - идентификатор; name - имя.
3. glpi_locations - id - идентификатор; name - имя.

Задача выбрать из tickets все заявки и сделать таблицу где есть номер заявки, имя заявки, тип устройства, ИМЯ УСТРОЙСТВА, организация (владелец устройства), местоположение устройства.
Проблема в том что имя надо выбирать из столбцов "name" 2-х разных таблиц (тип столбцов идентичен).
Я решил эту задачу путем UNION можно решить её подругому?

Решение без вывода Имени устройства:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
SELECT `glpi_tickets`.`id` AS ticket_id , 
    `glpi_tickets`.`name` AS title , 
    `glpi_tickets`.`status` AS STATUS, 
    `glpi_tickets`.`itemtype` AS itemtype, 
    `glpi_entities`.`name` AS entity, 
    `glpi_locations`.`name` AS location
FROM glpi_tickets 
LEFT JOIN `glpi_computers` ON (`glpi_tickets`.`items_id` =`glpi_computers`.`id`)
LEFT JOIN `glpi_printers` ON (`glpi_tickets`.`items_id` =`glpi_printers`.`id`)  
LEFT JOIN `glpi_entities` ON (`glpi_tickets`.`entities_id` =`glpi_entities`.`id`) 
LEFT JOIN `glpi_locations` ON (`glpi_computers`.`locations_id` =`glpi_locations`.`id`) OR (`glpi_printers`.`locations_id` =`glpi_locations`.`id`)
WHERE `glpi_tickets`.`id`<>0
результат:
ticket_id title status itemtype entity location
1 123 assign Printer Организация 2 Место 2
2 345 solved Printer Организация 3 Место 3
8 369 assign Monitor NULL Место 1
7 586 assign Computer Организация 1 Место 1
6 678 assign Computer NULL Место 1

Решение с выводом Имени устройства и UNION:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
SELECT `glpi_tickets`.`id` AS ticket_id , 
    `glpi_tickets`.`name` AS title , 
    `glpi_tickets`.`status` AS STATUS, 
    `glpi_tickets`.`itemtype` AS itemtype,
    `glpi_computers`.`name` AS name,
    `glpi_entities`.`name` AS entity, 
    `glpi_locations`.`name` AS location
FROM glpi_tickets 
JOIN `glpi_computers` ON (`glpi_tickets`.`items_id` =`glpi_computers`.`id`)
LEFT JOIN `glpi_entities` ON (`glpi_tickets`.`entities_id` =`glpi_entities`.`id`) 
LEFT JOIN `glpi_locations` ON (`glpi_computers`.`locations_id` =`glpi_locations`.`id`)
WHERE `glpi_tickets`.`itemtype`= "Computer"
UNION
SELECT `glpi_tickets`.`id` AS ticket_id , 
    `glpi_tickets`.`name` AS title , 
    `glpi_tickets`.`status` AS STATUS, 
    `glpi_tickets`.`itemtype` AS itemtype,
    `glpi_printers`.`name` AS name,
    `glpi_entities`.`name` AS entity, 
    `glpi_locations`.`name` AS location
FROM glpi_tickets 
JOIN `glpi_printers` ON (`glpi_tickets`.`items_id` =`glpi_printers`.`id`)
LEFT JOIN `glpi_entities` ON (`glpi_tickets`.`entities_id` =`glpi_entities`.`id`) 
LEFT JOIN `glpi_locations` ON (`glpi_printers`.`locations_id` =`glpi_locations`.`id`)
WHERE `glpi_tickets`.`itemtype`= "Printer"
результат:
ticket_id title status itemtype name entity location
7 586 assign Computer Computer 1 Организация 1 Место 1
6 678 assign Computer Computer 1 NULL Место 1
1 123 assign Printer Printer 2 Организация 2 Место 2
2 345 solved Printer Printer 3 Организация 3 Место 3

попытка решить без UNION

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT `glpi_tickets`.`id` AS ticket_id , 
    `glpi_tickets`.`name` AS title , 
    `glpi_tickets`.`status` AS STATUS, 
    `glpi_tickets`.`itemtype` AS itemtype,
    `glpi_printers`.`name` AS name,
        `glpi_computers`.`name` AS name,  
    `glpi_entities`.`name` AS entity, 
    `glpi_locations`.`name` AS location
FROM glpi_tickets 
LEFT JOIN `glpi_computers` ON (`glpi_tickets`.`items_id` =`glpi_computers`.`id`)
LEFT JOIN `glpi_printers` ON (`glpi_tickets`.`items_id` =`glpi_printers`.`id`)  
LEFT JOIN `glpi_entities` ON (`glpi_tickets`.`entities_id` =`glpi_entities`.`id`) 
LEFT JOIN `glpi_locations` ON (`glpi_computers`.`locations_id` =`glpi_locations`.`id`) OR (`glpi_printers`.`locations_id` =`glpi_locations`.`id`)
WHERE `glpi_tickets`.`id`<>0
результат
ticket_id title status itemtype name name entity location
1 123 assign Printer Printer 2 NULL Организация 2 Место 2
2 345 solved Printer Printer 3 NULL Организация 3 Место 3
8 369 assign Monitor Microsoft XPS Document Writer Computer 1 NULL Место 1
7 586 assign Computer Microsoft XPS Document Writer Computer 1 Организация 1 Место 1
6 678 assign Computer Microsoft XPS Document Writer Computer 1 NULL Место 1

то есть колонка имени "раздвоилась" как её соединить?

Извините, если сумбурно, я новичок, задавайте вопросы - уточню что непонятно.

Добавлено через 8 минут
Я бы выложил скрины, но что то не пойму как ...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.02.2012, 17:04
Ответы с готовыми решениями:

Сбор данных из разных файлов в один
Добрый день. Стоит задача собирать данные из нескольких файлов с одинаковой структурой в один,...

Сбор данных с разных xls таблиц в одну итоговую таблицу
Написан скрипт для сбора данных с разных xls таблиц в одну итоговую таблицу, но почему в итоговой...

Сбор данных из разных таблиц по признаку зелёного цвета выделения
Стоит задача собрать единоразового данные из таблиц excel, они выделены зелёным цветом в этих...

Как объединить два запроса с разных таблиц в один?
как объединить два запроса с разных таблицы в один сейчас есть вот такой запрос с выводом в...

5
1 / 1 / 0
Регистрация: 20.02.2012
Сообщений: 13
20.02.2012, 17:09  [ТС] 2
вот скрин табличек
Миниатюры
Сбор в один столбец запроса данных из столбцов 2-х разных таблиц.  
0
58 / 50 / 16
Регистрация: 23.06.2011
Сообщений: 122
20.02.2012, 18:52 3
А чем, собственно, UNION не устраивает...?
Можно сделать посредством создания переменной типа таблица.
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
--создали переменную
DECLARE @name_table TABLE
(
    first_feald INT,
    second_feald VARCHAR(20)
)
 
--вставили данные из первой таблицы
INSERT INTO @name_table (first_feald , second_feald)
SELECT ddd AS first_feald,
       ccc AS second_feald
FROM firstTable
 
--вставили данные из второй таблицы
INSERT INTO @name_table (first_feald , second_feald)
SELECT ddd AS first_feald,
       ccc AS second_feald
FROM secondTable
 
--вывели результат
SELECT @name_table
Добавлено через 13 минут
ой-ой-ой...затупил...последняя строчка:

SQL
1
SELECT * FROM @name_table
0
1 / 1 / 0
Регистрация: 20.02.2012
Сообщений: 13
20.02.2012, 19:32  [ТС] 4
не устраивает, то, что на сколько я понимаю он каждый раз будет по новой шерстить таблицу tickets, с учетом того что он будет ее пробегать для принтеров, мониторов, компьютеров, сетевого оборудования это будет 4 прохода, а хотелось бы все сделать за один.
и + код раздувается неимоверно.
ну и наконец просто очень интересно, я третий день голову ломаю как это можно сделать красиво.... я почему то уверен что есть красивое и простое решение этой задачки, вот только сам его пока не могу найти
0
1 / 1 / 0
Регистрация: 20.02.2012
Сообщений: 13
24.02.2012, 14:09  [ТС] 5
нашел решение. вдруг кому пригодиться.

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
SELECT `glpi_tickets`.`id` AS ticket_id, 
`glpi_tickets`.`name` AS title , 
`glpi_tickets`.`itemtype` AS itemtype, 
`glpi_entities`.`name` AS entity, 
`glpi_locations`.`name` AS location, 
CASE `glpi_tickets`.`status` 
WHEN "new" THEN "новая" 
WHEN "assign" THEN "принята" 
WHEN "plan" THEN "запланирована" 
WHEN "waiting" THEN "решается" 
WHEN "solved" THEN "решена" 
WHEN "closed" THEN "закрыта" 
ELSE "unknown" 
END AS STATUS, 
CASE `glpi_tickets`.`itemtype`
WHEN "Printer" THEN `glpi_printers`.`name`
 WHEN "Computer" THEN `glpi_computers`.`name`
 WHEN "Monitor" THEN `glpi_monitors`.`name` 
WHEN "NetworkEquipment" THEN `glpi_networkequipments`.`name` 
ELSE "unknown" 
END AS name 
FROM glpi_tickets 
LEFT JOIN `glpi_printers` ON (`glpi_tickets`.`items_id` =`glpi_printers`.`id`) 
LEFT JOIN `glpi_computers` ON (`glpi_tickets`.`items_id` =`glpi_computers`.`id`) 
LEFT JOIN `glpi_monitors` ON (`glpi_tickets`.`items_id` =`glpi_monitors`.`id`) 
LEFT JOIN `glpi_networkequipments` ON (`glpi_tickets`.`items_id` =`glpi_networkequipments`.`id`) 
LEFT JOIN `glpi_locations` ON (`glpi_printers`.`locations_id` =`glpi_locations`.`id`) OR (`glpi_computers`.`locations_id` =`glpi_locations`.`id`) OR (`glpi_monitors`.`locations_id` =`glpi_locations`.`id`) OR (`glpi_networkequipments`.`locations_id` =`glpi_locations`.`id`) 
LEFT JOIN `glpi_entities` ON (`glpi_tickets`.`entities_id` =`glpi_entities`.`id`)
WHERE `glpi_tickets`.`id`<>0
0
1109 / 754 / 182
Регистрация: 27.11.2009
Сообщений: 2,247
24.02.2012, 14:14 6
Странно обсуждать запросы MySQL на форуме по MSSQL
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.02.2012, 14:14
Помогаю со студенческими работами здесь

SELECT - запрос: выбрать данные из двух таблиц из разных столбцов и поместить в один
Например есть две таблицы: // PERSONS1 &quot;1&quot; &quot;Коля&quot; &quot;2&quot; &quot;Маша&quot; и // PERSONS2 &quot;1&quot; ...

Перенос данных из разных столбцов в один
Добрый день. Подскажите пожалуйста как столбец A объединить с B, чтобы данные получились общие?...

Сведение данных с разных столбцов в один
Помогите, пожалуйста решить такую проблемку. Есть набор данных на листе в разных столбцах....

Выбор данных из разных таблиц в один dgv.
Наткнулся на проблему выбора данных из разных таблиц и запись в один datagridview. Собственно,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru