2016-10-28 1 views
0

Мне нужно получить таблицу из подзапроса для каждой строки в моем запросе.MYSQL: получить подтаблицу в виде столбца

Например у меня есть 2 таблицы: компании, персонал:

**companies** 
company_id (int) 
company_name (char) 

**staff** 
staff_id (int) 
company_id (int) 
first_name (char) 
last_name (char) 
position (char) 

Я хочу, чтобы все сотрудники компании в качестве дополнительного столбца, что-то вроде этого:

SELECT c.company_name, 
(SELECT first_name, last_name, position FROM staff WHERE c.company_id = staff.company_id) as staff 
FROM companies c 

Очевидно, что выше запрос возвращает «Операнд должен содержать одну колонку (столбцы)».

Есть ли способ сделать это в MySQL?

+0

Хорошо, так как присоединение не сработает .... Можете ли вы показать ожидаемые результаты? – xQbert

+0

«Я хочу, чтобы все сотрудники компании были добавлены в дополнительную колонку», поэтому, если у компании 10 сотрудников, вы хотите, чтобы первая, последняя и позиция были указаны для всех сотрудников в 1 колонке? 'concat' &' Group_Concat' звучит как функции, которые вы хотите – xQbert

+0

Извините, это не работает для меня, данные о персонале включают дату рождения, department_id, статус, фотографию и т. д., поэтому я не могу просто конкатрировать все поля. – AlecTMH

ответ

2

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

SELECT c.company_name, S.first_name, S.last_name, S.position 
FROM companies c 
INNER JOIN staff 
    ON c.company_id = staff.company_id 

или вы хотите все это в одном столбце или что-то ...

SELECT c.company_name, concat(S.first_name, ' ', S.last_name, ' ', S.position) as staff 
FROM companies c 
INNER JOIN staff 
    ON c.company_id = staff.company_id 

Все еще не уверены, что вы после этого так возможно ...

SELECT c.company_name, Group_concat(concat(S.first_name, ' ', S.last_name, '-', S.position Order by Last_name, First_name SEPARATOR ':') as staff 
FROM companies c 
INNER JOIN staff S 
    ON c.company_id = staff.company_id 
GROUP BY c.Company_name 

Какого выше, следует выполнить конкатенацию позиции имени последней фамилии пространства имен для каждой строки, а затем объединить строки, разделенные символом:. Это приведет к 1 и только 1 записи для каждой компании в штате стола. таким образом, это не вызовет никаких проблем с отношениями 1-M. поскольку он будет относиться к компании/персоналу как к отношениям 1-1. В случае необходимости мы можем сделать генерацию как подзапрос, как в следующем ...

SELECT c.company_name, S.StaffList 
FROM companies c 
LEFT JOIN (SELECT company_ID, Group_concat(concat(S.first_name, ' ', S.last_name, '-', S.position Order by Last_name, First_name SEPARATOR ':') as staffList 
      FROM staff 
      GROUP BY Company_ID) S 
    ON c.company_id = S.company_id 

это должно привести к 1-1 отношений между компанией & персоналом. хотя staffList будет довольно сложным ...

+0

Я не могу, у моего реального родительского запроса много столбцов, соединенных из разных таблиц, поэтому мне нужна некоторая иерархия – AlecTMH

+0

Наверное, мой первый пример не очень хорош, представьте, что вам нужно перечислить всех менеджеров и перечислить всех его людей. Столбцы диспетчера отличаются друг от друга. Результат должен выглядеть так: Менеджер 1> Сотрудник 1, Сотрудник 2; Менеджер 2> Сотрудник 3, Сотрудник 4 и т. Д. Вы видите, что я имею в виду? – AlecTMH

+0

Итак, вам нужен иерархический запрос в mySQL, не так весело. но у SO есть несколько примеров: http://stackoverflow.com/questions/20215744/how-to-create-a-mysql-hierarchical-recursive-query Есть ли конечное число уровней? если это так, я должен сделать трюк ... – xQbert

Смежные вопросы