【问题标题】:GROUP_CONCAT With Nested Set Model带有嵌套集模型的 GROUP_CONCAT
【发布时间】:2011-06-02 16:22:39
【问题描述】:

我有一个使用嵌套集模型类来组织我的数据的应用程序,但是我正在尝试编写一个查询来 group_concat 我的结果。我知道我需要在某处放置一些子选择语句,但我想不通!

这是我目前的结构:

表:人

 -----------+------------+-----------
|Person_ID  | Name       | Age       |
 -----------+------------+-----------
| 1         | Mark Vance | 19        |
| 2         | Michael Tsu| 22        |
| 3         | Mark Jones | 29        |
| 4         | Sara Young | 25        |
 -----------+------------+-----------

表:person_to_group

 ----+------------+-----------
|ID  | Person_ID  | Group_ID  |
 ----+------------+-----------
| 1  | 3          | 1         |
| 2  | 3          | 2         |
| 3  | 1          | 2         |
| 4  | 4          | 3         |
 ----+------------+-----------

表格:组

 ----------+--------------+--------------+-------------
|Group_ID  | Group_Name   | Group_Left   | Group_Right |
 ----------+--------------+--------------+-------------
| 1        | Root         | 1            | 6           |
| 2        | Node         | 2            | 5           |
| 3        | Sub Node     | 3            | 4           |
 ----------+--------------+--------------+-------------

我需要用我的结果来渲染这样的东西:

//获取此人的group_ID,并将其放入class标签中...

<li class="2 3">Sara Young is in the Sub Node Group</li>

请注意,尽管 Sara 在 Sub Node 组中,但由于她是 Node 的孩子,她仍然被赋予 Node 的 id。

以下是我作为起点使用的查询。

SELECT *, GROUP_CONCAT( CAST( gg.Group_ID AS CHAR ) SEPARATOR ' ' ) Group_IDs
        FROM groups gg
        LEFT JOIN person_to_group AS t1 ON gg.Group_ID = t1.Group_ID
        LEFT JOIN person AS t2 ON t2.Person_ID = t1.Person_ID
        GROUP BY t2.per_ID 
        ORDER BY t2.Name ASC

任何帮助将不胜感激!

【问题讨论】:

    标签: php mysql group-by nested group-concat


    【解决方案1】:

    这是我编写查询的方式:

    SELECT p.Name, 
      GROUP_CONCAT( g.Group_Name ) AS Group_List,
      GROUP_CONCAT( CAST( gg.Group_ID AS CHAR ) SEPARATOR ' ' ) AS Group_ID_List
    FROM person AS p
    INNER JOIN person_to_group AS pg ON p.Person_ID = pg.Person_ID
    INNER JOIN groups AS g ON pg.Group_ID = g.Group_ID
    INNER JOIN groups AS gg ON g.Group_Left BETWEEN gg.Group_Left AND gg.Group_Right
    GROUP BY p.Name
    ORDER BY p.Name ASC
    

    注意,如果按人名分组,还需要对组名列表进行 GROUP_CONCAT。根据您的架构,由于多对多关系,一个人可能属于多个组。

    我也建议一般不要使用SELECT *。只需指定您需要的列。

    【讨论】:

      【解决方案2】:

      这有点有趣,因为我在 MsSQL 和 MySql 中都进行了编程。在 SQL 中,我使用了名为 STUFF 的函数。在 MySQL 中,您可以使用一个名为 INSERT 的函数。我在 MsSQL 中尝试了以下查询。没有方便的 MySQL 来尝试我的查询。如果我有时间,我会发布查询的 MySQL 版本。

      DECLARE @person TABLE (Person_ID INT, Name VARCHAR(50), Age INT)
      INSERT INTO @person VALUES
      (1,'Mark Vance',19),
      (2,'Michael Tsu',22),
      (3,'Mark Jones',29),
      (4,'Sara Young',25)
      
      
      DECLARE @groups TABLE (Group_ID INT, Group_Name VARCHAR(50), Group_Left INT, Group_Right INT)
      INSERT INTO @groups VALUES
      (1,'Root',1,6),
      (2,'Node',2,5),
      (3,'Sub Node',3,4)
      
      DECLARE @person_to_group TABLE (ID INT, Person_ID INT, Group_ID INT)
      INSERT INTO @person_to_group VALUES
      (1,3,1),
      (2,3,2),
      (3,1,1),
      (4,4,1),
      (4,1,1)
      
      SELECT *,STUFF((SELECT ',' + CAST(g.Group_ID AS VARCHAR) FROM @groups g 
          JOIN @person_to_group pg ON g.Group_ID = pg.Group_ID AND pg.Person_ID = a.Person_ID FOR XML PATH('')) , 1, 1, '' ) FROM @person a
      

      函数:INSERT(str,pos,len,newstr) 文档http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_insert

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-12
        • 2013-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-28
        • 2016-05-02
        相关资源
        最近更新 更多