Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.05.2014, 07:22   #1
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
По умолчанию Выбор из нескольких таблиц в зависимости от параметра

Добрый день.
Возможно ли сделать следующее в одном запросе выводить данные из первой таблички только заместо idAgent подставлять данные из поля FIO второй и третей таблички в зависимости от хранящегося параметра в поле TypeAgent
есть 3 таблички
Первая основная
-------
id
idAgent
TypeAgent
некие данные
-------
Вторая хранит фио лиц у которых поле TypeAgent = 1
id=idAgent из первой таблички
FIO
------
Третья хранит фио лиц у которых поле TypeAgent = 2
id=idAgent из первой таблички
FIO
__________
можно ли как то это реализовать в одном запросе или придется идти на ухищрения?
Lokos вне форума Ответить с цитированием
Старый 30.05.2014, 07:30   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Например так, а вообще-то и от СУБД зависит
Код:
select t.*,
    CASE WHEN TypeAgent=1 THEN T1.FIO ELSE T2.FIO END AS FIO
  from t
    left join t1 on t1.id=t.idAgent
    left join t2 on t2.id=t.idAgent
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 30.05.2014, 07:32   #3
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
По умолчанию

СУБД MySql

буду разбирать ваш пример спасибо

вроде понятно что значит t.*
t-обстрактная таблица
*- все поля?

И еще если у меня более 2-х типов чем можно else заменить?

Последний раз редактировалось Lokos; 30.05.2014 в 07:36.
Lokos вне форума Ответить с цитированием
Старый 30.05.2014, 07:43   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Дык почитай про синтаксис CASE
http://dev.mysql.com/doc/refman/5.0/en/case.html
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 30.05.2014, 07:48   #5
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Дык почитай про синтаксис CASE
http://dev.mysql.com/doc/refman/5.0/en/case.html
уже почитал только в другом месте, в принципе так и думал, получается так

Код:
select t.*,
    CASE
       WHEN TypeAgent=1 THEN T1.FIO 
       WHEN TypeAgent=2 THEN T2.FIO 
       WHEN TypeAgent=3 THEN T3.FIO  END AS FIO
  from t
    left join t1 on t1.id=t.idAgent
    left join t2 on t2.id=t.idAgent
    left join t3 on t3.id=t.idAgent
?
Lokos вне форума Ответить с цитированием
Старый 30.05.2014, 08:11   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

угу. точно.
или даже так (case и такое, имхо, допускает):
Код:

select t.*,
    CASE TypeAgent
       WHEN 1 THEN T1.FIO 
       WHEN 2 THEN T2.FIO 
       WHEN 3 THEN T3.FIO
       ELSE "not found agent"  END AS FIO
  from t
    left join t1 on t1.id=t.idAgent
    left join t2 on t2.id=t.idAgent
    left join t3 on t3.id=t.idAgent
p.s. а вообще данный подход попахивает нарушением принципов реляционных СУБД.
Если, вдруг, число типов агентов не жестко задано (раз и навсегда, строго 3), а может изменяться, то вам нужно будет добавлять ещё одну таблицу в базу (и во все запросы).
А это кривизна и свидетельствует о неверной структуре БД!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.05.2014, 08:14   #7
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
По умолчанию

строго 3 группы
А что за проблема с отзывами всегда пишет "Вы должны добавить отзыв прежде кому то еще ..."
Lokos вне форума Ответить с цитированием
Старый 30.05.2014, 08:17   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Можно было все ФИО в одну таблицу засунуть с типом соответствующим
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 30.05.2014, 08:24   #9
Lokos
Форумчанин
 
Регистрация: 29.09.2009
Сообщений: 587
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Можно было все ФИО в одну таблицу засунуть с типом соответствующим
можно было бы но уже сделано так, и придется править более 300 записей(
но с другой стороны уменьшится количество таблиц и упростится данный запрос но усложнятся другие, что будет выгодней с вашей точки зрения
добавить в одну таблицу все фио и добавить дополнительное поле отвечающее за группу и стереть 2 таблицы, или оставить как есть?
Lokos вне форума Ответить с цитированием
Старый 30.05.2014, 08:26   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Выгодней сделать правильно
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Расчитать функцию y(х) в зависимости от введенного параметра А gessi Компоненты Delphi 6 04.02.2020 21:34
Цвет строки ListBox через цикл в зависимости от параметра waka2ebawer Общие вопросы Delphi 2 11.07.2013 23:28
Расчёт в зависимости от выбор Lolalul JavaScript, Ajax 0 01.10.2012 03:05
сложный выбор данных из нескольких таблиц v.v.1992 C/C++ Базы данных 1 12.04.2012 06:28
Выбор строки из заданного параметра Antoha21 Microsoft Office Excel 3 24.07.2009 12:21