0

私は今のところうまく機能しているクエリに取り組んでいます(フロントエンドからの入力を使用して WHERE 句を生成しています)が、別のパラメーターを検索できるようにしたいので、本当に気が遠くなります。

  1. テーブルgroupsには ID、名前が含まれています。
  2. テーブルpersonsは、取得したい人がいる私のテーブルです。
  3. テーブル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 で生成) には、検索したグループのみが表示され、その人物がメンバーであるすべてのグループが表示されるわけではありません。

4

1 に答える 1

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`
于 2013-02-20T15:21:12.277 に答える