我正在处理一个现在已经运行良好的查询(我正在使用来自前端的输入来生成WHERE子句),但我希望能够搜索另一个参数,这真的让我的脑子陷入困境。 / p>
groups
包含id,name。persons
是我的表格,其中包含我想要检索的人员。group_memberships
是我的群组< - >人多对多关系表。列是参与者(person.id)和组(groups.id)检索到的结果集的最后一列是group_memberships的串联,但其中“1,2,3”已经通过JOIN替换为组的真实姓名。
今天是查询:
SELECT
`persons`.`id`,
CONCAT_WS(\' \', `fname`, `lname`) AS `full_name`,
`job_title`,
`email`,
`phone`,
`participant_group_memberships`.`memberships`
FROM
`persons`
LEFT JOIN (SELECT
`participant`, `name`,
GROUP_CONCAT(`groups`.`name` ORDER BY `groups`.`name`
SEPARATOR \', \') AS `memberships`
FROM
`group_memberships` JOIN `groups`
ON (`groups`.`id` = `group_memberships`.`group`)
GROUP BY `participant`) AS `participant_group_memberships`
ON (`participant_group_memberships`.`participant` = `persons`.`id`)
WHERE TRUE . $where . '
ORDER BY `full_name`
如果我添加WHERE name ='search_query_group',那么连接列表将仅显示该组不是我想要的组。我仍然希望展示该人所属的所有群体。
我还希望通过1个查询实现此目的,并且如果可能的话,避免使用IN()。
如您所见,最后一列(使用GROUP_CONCAT生成)将仅显示我搜索的组,而不是该人员所属的所有组。
答案 0 :(得分:1)
您可以在子查询的HAVING子句中使用SUM和CASE语句来包含搜索结果。您还需要将子连接的连接更改为INNER JOIN。这将返回所有属于某一群体的人,并显示他们所属的所有群体。
SELECT `persons`.`id`,
CONCAT_WS(\' \', `fname`, `lname`) AS `full_name`,
`job_title`,
`email`,
`phone`,
`participant_group_memberships`.`memberships`
FROM `persons`
JOIN `pers_department`
ON (`pers_department`.`pers_rid` = `persons`.`id`)
JOIN
(SELECT `participant`, `name`,
GROUP_CONCAT(`groups`.`name` ORDER BY `groups`.`name`
SEPARATOR \', \') AS `memberships`
FROM `group_memberships`
JOIN `groups` ON (`groups`.`id` = `group_memberships`.`group`)
GROUP BY `participant`
HAVING SUM(CASE WHEN name = 'search_query_group' THEN 1 ELSE 0 END) > 0
) AS `participant_group_memberships`
ON (`participant_group_memberships`.`participant` = `persons`.`id`)
WHERE TRUE . $where . '
ORDER BY `full_name`