先贴最终的mysql查询子集合的语句
SELECT id,p_id,ag_level
FROM (
SELECT t1.id,t1.p_id,t1.ag_level,
IF (find_in_set(p_id,@pids)> 0,@pids :=concat(@pids,',',id),0) AS ischild
FROM (
SELECT id,p_id,ag_level FROM yjy_xpp_user t ORDER BY t.ag_level
) t1,
(SELECT @pids :=1) t2
) t3 WHERE ischild !=0
字段解释:p_id父级id,ag_level等级(这个是因为我自己项目的原因,实际情况大家可以不用这个,但是需要修改一下查询语句,这里大家就自己改吧:))。
find_in_set(str,strlist):这个是查询strlist中str是否在里面,且返回位置,0表示没有找到。
@xx:=yy 定义参数xx为yy。
concat(str1,str2....) 将多个字符串拼接起来。
上面的解释就是 定义了pids为1(表示查询id为1的子集(不包含自己)),然后判断当前查询到的那条数据中的父级id是否在pids中,如果有就将当前的id加入到pids中,否则就输入0,pids等待下次查询后再做同样的判断直到结束。
结合下面的说明可以更加直观理解。
贴一下mysql的执行顺序:from>on>join>where>group>having>select>distinct>order>top
比如下面的sql语句
SELECT DISTINCT <select_list>
FROM <left_table>
<join_type>JOIN<right_table>
ON <join_condition>
WHERE <where_condition>
GROUP BY <group_by_list>
HAVING <having_condition>
ORDER BY <order_by_condition>
LIMIT <limit_number>
执行顺序如下
FROM <left_table>
ON <join_condition>
<join_type> JOIN <right_table>
WHERE<where_condition>
GROUP BY <group_by_list>
HAVING <having_condition>
SELECT
DISTINCT <select_list>
ORDER BY <order_by_condition>
LIMIT <limit_number>
查询父集合类似p_id和id对应的调整一下即可