私は今のところうまく機能しているクエリに取り組んでいます(フロントエンドからの入力を使用して WHERE 句を生成しています)が、別のパラメーターを検索できるようにしたいので、本当に気が遠くなります。
- テーブル
groups
には ID、名前が含まれています。 - テーブル
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 で生成) には、検索したグループのみが表示され、その人物がメンバーであるすべてのグループが表示されるわけではありません。