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

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
 

Krisha

pain in the neck
вообще ниче не выбирает:

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
 

Demiurg

Guest
SELECT Managers.*, Divisions.DivisionName, Companies.CompanyName FROM Managers, Divisions, Companies WHERE Managers.CompanyID = Companies.CompanyID AND Managers.DivisionID = Divisions.DivisionID
 

Krisha

pain in the neck
2Кром
Выбирает, тока криво, каждого манагера выбирает столько раз, сколько департаментов в компании, к которой он прренадлежит :)

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

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

Demiurg

Guest
>Выбирает, тока криво, каждого манагера выбирает столько раз, сколько департаментов в компании, к которой он прренадлежит
так и должно быть... что тебя смущает ?
 

Кром

Новичок
Так должно работать по идее.

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;
 

Krisha

pain in the neck
пока писал ответ, Кром скинул нужный запрос.

Кром, вери сенкс. :)
 

Demiurg

Guest
SELECT Managers.*, Divisions.DivisionName, Companies.CompanyName FROM Managers
left join Divisions using(DivisionID)
left join Companies usint(CompanyID)
 

Krisha

pain in the neck
Деми, твой запрос теряет имя компании для каждого манагера...

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

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;
 

Demiurg

Guest
только что заметил ... а как это у тебя таблицы связаны ? почем CompanyID есть во всех трех таблицах ?
 

Krisha

pain in the neck
есть:
"Компании"
"Департаменты"
"менеджеры Компании"
"менеджеры Департаментов"

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

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

Фух, вроде так :)
 

Demiurg

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

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

Krisha

pain in the neck
нет, так быть не может, менеджер всегда принадлежит только к одной компании или же всегда принадлежит только одному департаменту в компании

к примеру:

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

Krisha - Department manager (CompanyID = 2, DepartmentID=1) - менеджирует только конкретный департамент компании "CompanyID = 2"
 

Demiurg

Guest
Вообще у меня стойкое ощущение, что таких менеджеров надо распиивать в разные таблицы ..
 

Krisha

pain in the neck
то есть ты предлагаешь сделать так ?

Companies:
- CompanyID
- CompanyName

Departments:
- DepartmentID
- DepartmentName
- CompanyID

CompanyManagers:
- ManagerID
- ManagerName
- CompanyID

DepartmentManagers
- ManagerID
- ManagerName
- DepartmentID
 

Krisha

pain in the neck
пока не вижу как мне это облегчит жизнь, но обязательно подумаю :)

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

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

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