Выбор из EAV возвращает строки дважды - PullRequest
0 голосов
/ 26 октября 2018

У меня есть следующие таблицы

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        ║
╚═══════════╩═════════════╝

И я пытаюсь выбрать имя проекта, а также всех соответствующих контактных лиц, выполнив поиск фамилии контактного лица. Код, который я использую для этого,

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      ║
╚═════════════╩════════════════╩══════════╝

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

использование 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
0 голосов
/ 26 октября 2018

Использование 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`
...