2011-06-02 103 views
1

我有一个应用程序使用嵌套集模型类来组织我的数据,但我试图写一个查询,将group_concat我的结果。我知道我需要在某处放置一些子选择语句,但我无法弄清楚它!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   | 
----------+--------------+--------------+------------- 

我需要呈现索姆ething这样对我的结果:

//抓住了这个人的group_IDs并把它们放在类标签...

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

注意,虽然萨拉是子节点组中,她依然因为她是节点的孩子,因此被赋予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 

任何帮助将不胜感激!

回答

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 *。只需指定你需要的列。

+0

非常感谢Bill! – Rich 2011-06-02 22:10:29

0

这有点有趣,因为我在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