4 / 4 / 0
Регистрация: 04.10.2009
Сообщений: 54
1

Вывод 2-ух отделов

10.11.2012, 14:58. Показов 1130. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
На данный момент есть таблицы:
Users c полями id(INT), name(VARCHAR), department_id(INT);
Departments c полями id(INT), name(VARCHAR).
Выводить пользователей с их отделом очевидно просто через JOIN этих таблиц.
Но если у пользователя может быть несколько отделов (2 и более), как быть?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.11.2012, 14:58
Ответы с готовыми решениями:

БД+документооборот (проектирование), способ хранения сотрудников и наименование их отделов. Актуальность данных
Доброе время суток форумчане, Делаю документооборот между несколькими отделами (я их уже связал)....

Запрос: выбрать список отделов, работники которых являются подчиненными выбранного начальника
иметься три таблицы сотрудник - emloyer отдел -> dep и начальник -сhief 2.3 Выбрать список...

Два сервера для двух отделов
Здравствуйте. Нужно сделать чтобы сервер принадлежал одновременно двум отделам, как будто бы в...

Функция ВПР при выборе отделов
Здравствуйте! Помогите, пожалуйста, с формулой. Есть исходная таблица (она верхняя) - это...

10
9 / 9 / 0
Регистрация: 05.11.2012
Сообщений: 32
10.11.2012, 15:42 2
Сначала подумай а как ты вообще сможешь записать данные в таблицу Users при условии что id это первичный ключ. Ты же просто не сможешь вставить данные отражающие факт работы пользователя в нескольких отделах, так что думать о том как ты данные будешь выбирать пока преждевременно, нужно прорабатывать структуру таблиц. Гугли про реализацию отношения между сущностями многие-ко-многим(many-to-many). Если коротко то тебе нужна третья таблица, что-то типа user_department(user_id,department_id) а поле department_id из таблицы users нужно удалить, но лучше почитай основательно теорию про модель-сущность связи и её нормализацию.
0
4 / 4 / 0
Регистрация: 04.10.2009
Сообщений: 54
10.11.2012, 16:03  [ТС] 3
Я добавил 3-тью связную таблицу users_departments с полями id(INT), user_id(INT), department_id(INT).
И при запросе:
SQL
1
SELECT  *  FROM users  LEFT JOIN users_departments ON users.id=users_departments.user_id;
Я получаю:
http://dc581.2shared.com/downl... 3-d1306364
А мне нужно на странице вывести все отделы по каждому пользователю.
0
9 / 5 / 1
Регистрация: 09.11.2012
Сообщений: 31
10.11.2012, 16:30 4
Нужно сделать запрос ко всем таблицам сразу. Попробуйте вот так:
SQL
1
2
3
SELECT u.id uid, u.name name, d.id did, d.name department 
FROM users u, departments d, user_departments ud 
WHERE u.id = ud.user_id AND d.id = ud.department_id
0
4 / 4 / 0
Регистрация: 04.10.2009
Сообщений: 54
10.11.2012, 16:41  [ТС] 5
Цитата Сообщение от Serg@NT Посмотреть сообщение
Нужно сделать запрос ко всем таблицам сразу. Попробуйте вот так:
SQL
1
2
3
SELECT u.id uid, u.name name, d.id did, d.name department 
FROM users u, departments d, user_departments ud 
WHERE u.id = ud.user_id AND d.id = ud.department_id
Это немного не то, но спс.
Я уточню задачу.

На выходе должны быть все пользователи, и одно дополнительное поле где будут через запетую(или пробел) все их отделы.
0
9 / 9 / 0
Регистрация: 05.11.2012
Сообщений: 32
10.11.2012, 17:08 6
Если придерживаться соглашений что для первичного ключа выбирается имя по следующему правилу: имя_таблицы+_id то будет очень удобно использовать более короткую нотацию для джойнов с помощью USING вместо ON:
MySQL
1
2
3
SELECT  u.name, d.name  FROM users u
LEFT JOIN users_departments USING(user_id) -- заменть LEFT на INNER если не нужно показывать пользователей ни прикрепленных ни к одному департаменту.
INNER JOIN departments d USING(department_id)
Добавлено через 24 минуты
На выходе должны быть все пользователи, и одно дополнительное поле где будут через запетую(или пробел) все их отделы.
MySQL
1
2
3
4
SELECT  u.*, GROUP_CONCAT(d.name SEPARATOR ',')  FROM users u
LEFT JOIN users_departments USING(user_id) -- заменть LEFT на INNER если не нужно показывать пользователей ни прикрепленных ни к одному департаменту.
INNER JOIN departments d USING(department_id)
GROUP BY u.user_id
0
4 / 4 / 0
Регистрация: 04.10.2009
Сообщений: 54
10.11.2012, 17:58  [ТС] 7
То что сверху решил.
Теперь выводит только одного пользователя?
SQL
1
2
3
4
SELECT  u.*, GROUP_CONCAT(d.name SEPARATOR ',')  FROM users u
LEFT JOIN users_departments ON users_departments.user_id=u.id
INNER JOIN departments d ON d.id=users_departments.department_id
GROUP BY u.id;
0
9 / 9 / 0
Регистрация: 05.11.2012
Сообщений: 32
10.11.2012, 18:15 8
Ну а ты сам не можешь посмотреть что этот запрос выводит? Выводит информацию по всем пользователям, если нужно выбирать информацию только по какому-нибудь конкретному пользователю то допиши предложение WHERE u.id=123456.
0
4 / 4 / 0
Регистрация: 04.10.2009
Сообщений: 54
10.11.2012, 18:29  [ТС] 9
Цитата Сообщение от Vermut Посмотреть сообщение
Ну а ты сам не можешь посмотреть что этот запрос выводит? Выводит информацию по всем пользователям, если нужно выбирать информацию только по какому-нибудь конкретному пользователю то допиши предложение WHERE u.id=123456.
Последнее!
Выводит только тех у кого назначены отделы(хотя стоит INNER, как вы советовали).
А нужно выаодить всех, даже тех у кого они не назначены.
SQL
1
2
3
4
SELECT  u.*, GROUP_CONCAT(d.name SEPARATOR ',')  FROM users u
INNER JOIN users_departments ON users_departments.user_id=u.id
INNER JOIN departments d ON d.id=users_departments.department_id
GROUP BY u.id;
0
9 / 9 / 0
Регистрация: 05.11.2012
Сообщений: 32
10.11.2012, 18:48 10
Не наверно или я неправильно выразился или ты не так понял, всё правильно INNER JOIN выведет только тех пользователей у которых есть отделы, LEFT JOIN выведет даже тех пользователей у которых нет отделов. Вот неплохая статья о том как работают джойны Understanding JOINs in MySQL
1
4 / 4 / 0
Регистрация: 04.10.2009
Сообщений: 54
10.11.2012, 18:55  [ТС] 11
Цитата Сообщение от Vermut Посмотреть сообщение
Не наверно или я неправильно выразился или ты не так понял, всё правильно INNER JOIN выведет только тех пользователей у которых есть отделы, LEFT JOIN выведет даже тех пользователей у которых нет отделов. Вот неплохая статья о том как работают джойны Understanding JOINs in MySQL
Спасибо, огромное! Почитаю!
0
10.11.2012, 18:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.11.2012, 18:55
Помогаю со студенческими работами здесь

Диаграмма соотношения отделов сотрудников 1С, собственная конфигурация
Здравствуйте, вот такая у меня задача, имеются два отдела: Отдел1 и Отдел2(справочники). В...

Дополнительный заработок для сотрудников айти-отделов и сисадминов
Компания 1С:Франчайзи предлагает выгодные условия сотрудничества для сотрудников IT - отделов /...

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

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru