MYSQL:获取子列作为列

时间:2016-10-28 14:22:08

标签: mysql

我需要从查询的每一行获取子查询表。

例如我有两张桌子:公司,员工:

**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

显然上面的查询返回“操作数应该包含1列”错误。

在MySQL中有没有办法做到这一点?

1 个答案:

答案 0 :(得分: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-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会相当复杂......