mysql 查询子集合或父集合

先贴最终的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对应的调整一下即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值