我有以下表格
contacts
╔═══════════╦═══════════╦══════════╦═══════════╗
║ contactId ║ projectId ║ lastName ║ type ║
╠═══════════╬═══════════╬══════════╬═══════════╣
║ 1 ║ 1 ║ Foo ║ architect ║
║ 2 ║ 1 ║ Owner 1 ║ owner ║
║ 3 ║ 1 ║ Owner 2 ║ owner ║
╚═══════════╩═══════════╩══════════╩═══════════╝
projectDetails
╔═══════════╦═════════════╗
║ projectId ║ projectName ║
╠═══════════╬═════════════╣
║ 1 ║ Bar ║
║ 2 ║ Fizz ║
╚═══════════╩═════════════╝
我正在尝试通过搜索联系人的姓氏来选择projectName以及所有相关的联系人。我正在使用它来执行此操作的代码
SELECT `det`.`projectName`, `owner`.`lastName` as `ownerLast`, `architect`.`lastName` as `archLast`,
FROM `projectDetails` as `det`
LEFT JOIN `contacts` as `owner`
ON `owner`.`projectId` = `det`.`projectId` AND `owner`.`type`="owner"
LEFT JOIN `contacts` as `architect`
ON `architect`.`projectId` = `det`.`projectId` AND `architect`.`type`="architect"
WHERE `architect`.`lastName` = "Foo"
这会生成两行
╔═════════════╦═══════════╦══════════╗
║ projectName ║ ownerLast ║ archLast ║
╠═════════════╬═══════════╬══════════╣
║ Bar ║ Owner1 ║ Foo ║
║ Bar ║ Owner2 ║ Foo ║
╚═════════════╩═══════════╩══════════╝
我认为这是有道理的,但不是我正在寻找的。有没有办法聚合相同类型的结果,例如
╔═════════════╦════════════════╦══════════╗
║ projectName ║ ownerLast ║ archLast ║
╠═════════════╬════════════════╬══════════╣
║ Bar ║ Owner1, Owner2 ║ Foo ║
╚═════════════╩════════════════╩══════════╝
使用group_concat()
SELECT `det`.`projectName`, group_concat(`owner`.`lastName`) as `ownerLast`, `architect`.`lastName` as `archLast`,
FROM `projectDetails` as `det`
LEFT JOIN `contacts` as `owner`
ON `owner`.`projectId` = `det`.`projectId` AND `owner`.`type`="owner"
LEFT JOIN `contacts` as `architect`
ON `architect`.`projectId` = `det`.`projectId` AND `architect`.`type`="architect"
WHERE `architect`.`lastName` = "Foo"
group by `det`.`projectName`,`architect`.`lastName`
使用group_concat()
SELECT `det`.`projectName`, group_concat( `owner`.`lastName`) as `ownerLast`, `architect`.`lastName` as `archLast`,
FROM `projectDetails` as `det`
LEFT JOIN `contacts` as `owner`
ON `owner`.`projectId` = `det`.`projectId` AND `owner`.`type`="owner"
LEFT JOIN `contacts` as `architect`
ON `architect`.`projectId` = `det`.`projectId` AND `architect`.`type`="architect"
WHERE `architect`.`lastName` = "Foo"
group by `det`.`projectName`,archLast