我需要从查询的每一行获取子查询表。
例如我有两张桌子:公司,员工:
**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中有没有办法做到这一点?
答案 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会相当复杂......