0
我正在處理一個現在運行良好的查詢(我使用來自前端的輸入來生成WHERE子句),但我希望能夠搜索在另一個參數上,這真的讓我頭腦發呆。選擇屬於某個組的所有用戶,複雜的查詢
- 表
groups
包含id,name。 - 表
persons
是我的表與我想要檢索的人。 - 表
group_memberships
是我的羣<->人多對多關係表。列是參與者(person.id)和組(group.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`
如果我添加其中name =「search_query_group」然後拼接列表僅會顯示該組這不是我想要的。我仍然想顯示所有人屬於的組。
我也想用1個查詢來實現這一點,並避免在必要時使用IN()。
正如你所看到的,最後一列(與GROUP_CONCAT生成)將只顯示我搜索了該組,並非所有的羣體的人的成員。
謝謝,我會試試看。這是一種常見的做法還是SUM/CASE只是一個骯髒的黑客?從未見過它。 – silkfire 2013-02-20 15:33:49
這是我書中的一個巧妙的技巧。 :)我不會稱之爲黑客。它運作良好,我經常使用它。在很多情況下(比如這個),我認爲這是最好的選擇。 – Tom 2013-02-20 15:37:53
好吧,我試過了,不幸的是它沒有任何區別。所有用戶都將返回,但組成員身份正確顯示。 另外我不知道這將如何影響我的$哪裏變量?因爲我把它放在ORDER BY之前,我不能把它們放在兩個地方:) – silkfire 2013-02-20 17:04:56