Выборка значений из трех таблиц

  • Автор темы Автор темы Krisha
  • Дата начала Дата начала

Krisha

pain in the neck
Выборка значений из трех таблиц

Есть 3 таблицы:

Companies:
- CompanyID
- CompanyName

Divisions:
- DivisionID
- DivisionName
- CompanyID

Managers:
- ManagerID
- CompanyID
- DivisionID

Нужно выбрать всё из таблицы Managers + Companies.CompanyName + Divisions.DivisionName для каждого менеджера, то есть на выходе получить:

Manager || Company || Division

Помогите с запросом плиз.
 
Что то в этом роде:

SELECT Managers.*, DivisionName, CompanyName FROM Managers, Divisions, Companies WHERE ManagerID = 1 AND Managers.CompanyID = Companies.CompanyID AND Managers.DivisionID = Divisions.DivisionID
 
вообще ниче не выбирает:

Impossible WHERE noticed after reading const tables

нужно выбрать всех манагеров, и для каждого еще выбрать имя компании, к которой он относится и, если есть, имя дивизиона
 
А так выбирает?

SELECT * FROM Managers LEFT JOIN Companies ON Managers.CompanyID = Companies.CompanyID LEFT JOIN Divisions ON Companies.CompanyID = Divisions.CompanyID
 
SELECT Managers.*, Divisions.DivisionName, Companies.CompanyName FROM Managers, Divisions, Companies WHERE Managers.CompanyID = Companies.CompanyID AND Managers.DivisionID = Divisions.DivisionID
 
2Кром
Выбирает, тока криво, каждого манагера выбирает столько раз, сколько департаментов в компании, к которой он прренадлежит :)

2Demiurg
Вот такой запрос и я делаю, выбирает только одного
манагера, а у меня их аж 3...

Ха, блина, тока щас дошло, у меня может быть, что манагер не принадлежит к дивизиону (то есть DivisionID=0), вот, блин тормоз. То есть нужно еще какое-то условие добавить ?
 
>Выбирает, тока криво, каждого манагера выбирает столько раз, сколько департаментов в компании, к которой он прренадлежит
так и должно быть... что тебя смущает ?
 
Так должно работать по идее.

SELECT Managers.ManagerID, Managers.CompanyID, Companies.CompanyName, Managers.DivisionID, Divisions.DivisionName
FROM (Managers LEFT JOIN Companies ON Managers.CompanyID = Companies.CompanyID) LEFT JOIN Divisions ON Managers.DivisionID
= Divisions.DivisionID;
 
пока писал ответ, Кром скинул нужный запрос.

Кром, вери сенкс. :)
 
SELECT Managers.*, Divisions.DivisionName, Companies.CompanyName FROM Managers
left join Divisions using(DivisionID)
left join Companies usint(CompanyID)
 
Деми, твой запрос теряет имя компании для каждого манагера...

Всё, всем спасибо, всё получилось, вот то, что было нужно:

SELECT Managers.*, Managers.CompanyID, Companies.CompanyName, Managers.DivisionID, Divisions.DivisionName
FROM (Managers LEFT JOIN Companies ON Managers.CompanyID = Companies.CompanyID) LEFT JOIN Divisions ON Managers.DivisionID
= Divisions.DivisionID;
 
только что заметил ... а как это у тебя таблицы связаны ? почем CompanyID есть во всех трех таблицах ?
 
есть:
"Компании"
"Департаменты"
"менеджеры Компании"
"менеджеры Департаментов"

Менеджеры всегда принадлежать к какой-то компании, но менеджер не обязательно принадлежит к какому-то департаменту, в этом случае у него есть id компании, а id департамента = 0, если id департамента = 0, значит манагер компании, а не департамента. Ну и ессное дело, компания имеет департаменты, а иногда не имеет.

Получаем id компании у манагера и id компании у департамента, ну и есно автоинкрементное поле CompanyID собственно в самой таблице Companies.

Фух, вроде так :)
 
У тебя получается явное излишество. Если у менеджера id компании одно, а id департамента - совсем другой, причем департамент не в ходит в ту компанию от кторой у этого менеджера id, тогда что ?

может лы быть один менеджер менеджером сразу в нескольких компаниях/департаментах ?
 
нет, так быть не может, менеджер всегда принадлежит только к одной компании или же всегда принадлежит только одному департаменту в компании

к примеру:

Vasya Pupkin - Company manager (CompanyID = 2, DepartmentID=0) - менеджирует все департаменты компании "CompanyID = 2" скопом

Krisha - Department manager (CompanyID = 2, DepartmentID=1) - менеджирует только конкретный департамент компании "CompanyID = 2"
 
Вообще у меня стойкое ощущение, что таких менеджеров надо распиивать в разные таблицы ..
 
то есть ты предлагаешь сделать так ?

Companies:
- CompanyID
- CompanyName

Departments:
- DepartmentID
- DepartmentName
- CompanyID

CompanyManagers:
- ManagerID
- ManagerName
- CompanyID

DepartmentManagers
- ManagerID
- ManagerName
- DepartmentID
 
пока не вижу как мне это облегчит жизнь, но обязательно подумаю :)

в любом случае мерси!

P.S. Пока виджу такой плюс, если нужно будет связать менеджеров компаний и менеджеров департаментов, то придется их таки разделяь на таблицы, к примеру если нужно будет запоминать какой менеджер компании добавил в базу менеджера департамента... вот

P.S. Но есть, как мне кажется, и минус, у меня еще есть юзеры, которые ходят под манагерами и как мне тогда определять какой манагер добавил юзера, если они будут в разных таблицах и модет быть 2 манагера в одинаковым айди, фича в том, что менеджер компании админит всех юзеров компании, а манагер департамента тока своих
 
Сверху