1.表设计如下
2.测试数据如下
3.需求
查询某级别下面所有的子级别(假设级别最多只有3级),例如,某级别的id=1000000000,查询如下
SELECT * FROM t_commodity_type tct WHERE tct.PARENT_TYPE_ID = 1000000000
UNION ALL
SELECT * FROM t_commodity_type tct2 WHERE tct2.PARENT_TYPE_ID in (SELECT tct3.COMMODITY_TYPE_ID FROM t_commodity_type tct3 WHERE tct3.PARENT_TYPE_ID = 1000000000)
4.如果存在多级的话,一直union all下去
5.针对业务改善如上表设计
很明显,一个现级id、一个父级id不能方便的查询,还需要增加一个原级id。
这样,查询某个级别下面所有子级的时候,就可以挂上级别和原级id查询,这样方便些。
6.针对如上表的更新
更新某个级别下面所有的use_flag,如下的sql假设该级别为1
UPDATE
t_commodity_type tct
SET
tct.USE_FLAG = 0,
tct.UPD_USER_ID = #{userId},
tct.UPD_TIME = #{updTime}
WHERE
(
tct.COMMODITY_TYPE_ID = #{commodityTypeId}
AND
tct.COMMODITY_LEVEL = 1
)
OR
(
tct.PARENT_TYPE_ID = #{commodityTypeId}
AND
tct.COMMODITY_LEVEL = 2
)
OR
tct.COMMODITY_TYPE_ID IN
(
SELECT
tct3.COMMODITY_TYPE_ID
FROM
t_commodity_type tct3
LEFT JOIN
t_commodity_type tct2
ON
tct3.PARENT_TYPE_ID = tct2.COMMODITY_TYPE_ID
WHERE
tct3.COMMODITY_LEVEL = 3
AND
tct2.PARENT_TYPE_ID = #{commodityTypeId}
)