Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Упростить запрос [D7, MySQL]


parovoZZ ©   (2006-09-04 13:41:00) 

Есть запрос

'SELECT Equipment_name as name FROM Equipments WHERE ' +
   '((SELECT System_ID FROM Systems WHERE System_name=:prmSys)=System) and ' +
    '((SELECT Object_ID FROM Objects WHERE Object_name=:prmObj)=Object_) GROUP BY Equipment_name'

Есть три таблицы
Systems с полями System_ID и System_name
Objects с полями Object_ID и Object_name

Equipments с полями Equipment_name, System (связан с Systems.System_ID) и Object_ (связан с Objects.Object_ID)

Пользователь вводит названия prmObj и prmSys.

Можно ли его упростить?


parovoZZ   (2006-09-05 14:49:00) [1]

Ну да. Запрос-то не работает ни фига.
Остаётся два варианта
либо юзать [8]
либо делать выборку ID.


Aristarh Dark   (2006-09-04 20:26:00) [2]

Не знаю какой движок используется, но для MS SQL написал бы так.
имеем:
'SELECT Equipment_name as name FROM Equipments WHERE ' +
'((SELECT System_ID FROM Systems WHERE System_name=:prmSys)=System) and ' +
'((SELECT Object_ID FROM Objects WHERE Object_name=:prmObj)=Object_) GROUP BY Equipment_name'

и Есть три таблицы
Systems с полями System_ID и System_name
Objects с полями Object_ID и Object_name
Equipments с полями Equipment_name, System (связан с Systems.System_ID) и Object_ (связан с Objects.Object_ID)
Пользователь вводит названия prmObj и prmSys

Соответственно:
SELECT Equipment_name as [Name]
FROM (Equipments Eq LEFT JOIN System Sys ON Eq.System_ID = Sys.System_ID) LEFT JOIN Object_ Obj ON Eq.Object_ID = Obj.Object_ID
WHERE
Obj.ObjectName = :prmObj
AND
Sys.System_Name = :prmSys
GO

думается что что-то вроде этого, со скобками не уверен :) Ну а с группировкой - это надо по набору данных смотреть
Но писать так:
((SELECT System_ID FROM Systems WHERE System_name=:prmSysИМХО совсем неверно т.к. SELECT возвращает набор данных и сравнивать его с параметром негоже


Sergey13   (2006-09-04 15:59:00) [3]

2 [5] parovoZZ ©   (04.09.06 15:42)

> [4] MaxDAG ©   (04.09.06 15:22)

Не подойдет?


Desdechado   (2006-09-04 15:56:00) [4]

Пояснения, что и где - это хорошо.
Но пока сам для себя или для нас не сформулируешь, что нужно получить в результате, вряд ли будет запрос.


parovoZZ   (2006-09-04 15:42:00) [5]


> что нужно получить в результате запроса?

Есть список систем, есть список объектов. Также есть список оборудования, которое установлено на определённом объекте и относится к определённому классу систем. Например, есть записи
Радиовещание -> Квартира 10 -> радио
Радиовещание -> Квартира 10 -> 3-х радио
Телевещание -> Квартира 20 -> телевизор

Если пользователь вводит Радиовещание и Квартира 10, то ему будет предложено занести информацию о радио или о 3-х радио.
Если пользователь вводит Радиовещание и Квартира 20, то ему будет сообщено, что оборудования данной системы нет по такому адресу. Примерно так.


> > [0] parovoZZ ©   (04.09.06 13:41)GROUP BY - тут нафиг
> не нужен, а в остальном - что не устраивает?

Запрос выдаст
радио
радио
радио
радио
3-х радио
3-х радио
3-х радио
3-х радио

Без него никак.


> Связки с Systems и Object_ многие к одному ? Тогда лучше
> заменить на джойны.


А какую таблицу делать главной, а какую подчинённой?
Всё время юзал внутреннее связывание и всё работало. А тут вдруг стало лень перекачивать ID - ки на сторону клиента и их там сохранять.


MaxDAG   (2006-09-04 15:22:00) [6]

Можно:
Вариант без связывания
 select a.Equipment_name as name
 from   Equipments a, Systems b, Objects c
 where (b. System_name=:prmSys) and
          (b.System_ID=a.System) and
          (c. Object_name=:prmObj) and
          (c. Object_ID=a. Object_)


ANB   (2006-09-04 14:06:00) [7]


> Equipments с полями Equipment_name, System (связан с Systems.
> System_ID) и Object_ (связан с Objects.Object_ID)

Связки с Systems и Object_ многие к одному ? Тогда лучше заменить на джойны.


Sergey13   (2006-09-04 13:48:00) [8]

> [0] parovoZZ ©   (04.09.06 13:41)

GROUP BY - тут нафиг не нужен, а в остальном - что не устраивает?


Desdechado   (2006-09-04 13:46:00) [9]

что нужно получить в результате запроса?


Наверх

Титульная страница Поиск, карта сайта Написать письмо