PDA

Показать полную графическую версию : [решено] Связывание значения столбца с именем таблицы


Rikka
24-10-2016, 06:00
Здравствуйте!
Нужна помощь как связать в запросе значение столбца с таблицей. В таблице items_id_tiket в столбце меняется значение Itemstype, и это значение указывает на таблицу с соответствующими значениями.
Помогите с запросом.

select x.name, x.serail
From items_id_tiket t, (Monitors, Printers) x
Where t.Items_id = x.id
and t.id = 1

---
Таблица items_id_tiket
id Itemstype Items_id
1 Monitor 70

Таблица Monitors
id Name Serial
70 Acer 2001

Таблица Printers
id Name Serial
70 HP 203

shisik
24-10-2016, 15:32
Не буду утверждать на 100%, но по-моему это вообще невозможно в рамках одного запроса.

Вообще у вас какая-то странная организация БД. Зачем отдельные таблицы для мониторов и принтеров, если их структура одинакова? Пусть будет одна таблица для всех товаров с дополнительным полем item_type. ID у всех товаров будут уникальны, а если нужно будет выбрать только мониторы, добавите в запрос условие item_type='Monitor'.

Rikka
24-10-2016, 19:07
Не буду утверждать на 100%, но по-моему это вообще невозможно в рамках одного запроса.

Вообще у вас какая-то странная организация БД. Зачем отдельные таблицы для мониторов и принтеров, если их структура одинакова? Пусть будет одна таблица для всех товаров с дополнительным полем item_type. ID у всех товаров будут уникальны, а если нужно будет выбрать только мониторы, добавите в запрос условие item_type='Monitor'.

Допиливаем систему GLPI - и структура уже как есть.
Согласна на использование подзапросов)))

y--
24-10-2016, 19:59
Rikka,
UNION ALL для выборок с одинаковой структурой...

shisik
25-10-2016, 02:16
Согласна на использование подзапросов))) »

Тогда всё предельно просто. Первый запрос выбирает нужную запись из items_id_tiket и оттуда берётся значение Itemstype, которое и подставляется во второй запрос. Правда, я смотрю, у вас не совпадают значения Itemstype с именами таблиц. Значения Itemstype в единственном числе (Monitor), а таблица называется Monitors. Добавить эту s не проблема, но это же частный случай и вообще жуткий костыль.

Rikka
25-10-2016, 05:28
Тогда всё предельно просто. Первый запрос выбирает нужную запись из items_id_tiket и оттуда берётся значение Itemstype, которое и подставляется во второй запрос. Правда, я смотрю, у вас не совпадают значения Itemstype с именами таблиц. Значения Itemstype в единственном числе (Monitor), а таблица называется Monitors. Добавить эту s не проблема, но это же частный случай и вообще жуткий костыль. »
Сделала вот так:

select trim(concat(u.realname, ' ', u.firstname)) full_name
, x.name, x.otherserial, t.itilcategories_id, t.name, t.id, x.id
From glpi_tickets t, glpi_users u, glpi_items_tickets it,
(SELECT 'computer' name_tbl, id, name, otherserial, locations_id, users_id
FROM glpi_computers
UNION ALL
SELECT 'monitor' name_tbl, id, name, otherserial, locations_id, users_id
FROM glpi_monitors
UNION ALL
SELECT 'peripheral' name_tbl, id, name, otherserial, locations_id, users_id
FROM glpi_peripherals
UNION ALL
SELECT 'phone' name_tbl, id, name, otherserial, locations_id, users_id
FROM glpi_phones
UNION ALL
SELECT 'printer' name_tbl, id, name, otherserial, locations_id, users_id
FROM glpi_printers
)x
Where t.users_id_recipient = u.id
and t.date >= CURDATE()
and x.name_tbl = it.itemtype
and t.itilcategories_id = 9
and t.id = it.tickets_id
and it.items_id = x.id
and upper(trim(concat(u.realname, ' ', u.firstname))) = ?

---

shisik, y-- спасибо за помощь ;)




© OSzone.net 2001-2012