选择属于某个组的所有用户,复杂查询

时间:2013-02-20 15:04:11

标签: php mysql join group-concat

我正在处理一个现在已经运行良好的查询(我正在使用来自前端的输入来生成WHERE子句),但我希望能够搜索另一个参数,这真的让我的脑子陷入困境。 / p>

  1. groups包含id,name。
  2. persons是我的表格,其中包含我想要检索的人员。
  3. group_memberships是我的群组< - >人多对多关系表。列是参与者(person.id)和组(groups.id)
  4. 检索到的结果集的最后一列是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()。

    enter image description here

    如您所见,最后一列(使用GROUP_CONCAT生成)将仅显示我搜索的组,而不是该人员所属的所有组。

1 个答案:

答案 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`