2013-02-20 46 views
0

我正在處理一個現在運行良好的查詢(我使用來自前端的輸入來生成WHERE子句),但我希望能夠搜索在另一個參數上,這真的讓我頭腦發呆。選擇屬於某個組的所有用戶,複雜的查詢

  1. groups包含id,name。
  2. persons是我的表與我想要檢索的人。
  3. 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()。

enter image description here

正如你所看到的,最後一列(與GRO​​UP_CONCAT生成)將只顯示我搜索了該組,並非所有的羣體的人的成員。

回答

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` 
+0

謝謝,我會試試看。這是一種常見的做法還是SUM/CASE只是一個骯髒的黑客?從未見過它。 – silkfire 2013-02-20 15:33:49

+1

這是我書中的一個巧妙的技巧。 :)我不會稱之爲黑客。它運作良好,我經常使用它。在很多情況下(比如這個),我認爲這是最好的選擇。 – Tom 2013-02-20 15:37:53

+0

好吧,我試過了,不幸的是它沒有任何區別。所有用戶都將返回,但組成員身份正確顯示。 另外我不知道這將如何影響我的$哪裏變量?因爲我把它放在ORDER BY之前,我不能把它們放在兩個地方:) – silkfire 2013-02-20 17:04:56