如何在mysql中找到父级和子级关系

如何在mysql中找到父级和子级关系,mysql,parent-child,Mysql,Parent Child,我有一个表:用户 表字段: user_id PK INT AI user_name VARCHAR (45) parent_user_id FK INT 请创建一个查询,该查询可以告诉我任意两个用户之间的步数差异 例如: user_names: dave and abha steps difference: 3 说明: dave是pritesh的父母1步骤pritesh是Larry的父母2步骤Larry是abha的父母3步骤 我已经尝试了以下查询: SELECT (CASE

我有一个表:用户

表字段:

user_id PK INT AI

user_name VARCHAR (45)

parent_user_id FK INT
请创建一个查询,该查询可以告诉我任意两个用户之间的步数差异

例如:

user_names: dave and abha
steps difference: 3 
说明: dave是pritesh的父母1步骤pritesh是Larry的父母2步骤Larry是abha的父母3步骤

我已经尝试了以下查询:

SELECT (CASE
         WHEN (count(T2.user_id) - 1) = -1
             THEN 0
             ELSE (count(T2.user_id) - 1)
   END) as steps
FROM
(
SELECT
    @r AS _id,
    (
    SELECT
        @r := parent_user_id
    FROM
        USER
    WHERE
        user_id = _id
) AS parent_user_id,
@l := @l + 1 AS lvl
FROM
(
SELECT
@r := (select MAX(user_id) from USER),
@l := (select MIN(user_id) from USER)
) vars,
USER h
WHERE
@r <> 0
) T1
JOIN
USER T2
ON
T1._id = T2.user_id
WHERE
   (CASE
   WHEN (SELECT user_id FROM USER WHERE user_name= _name1) < (SELECT user_id FROM USER WHERE user_name= _name2)
        THEN (T2.user_id BETWEEN (SELECT user_id FROM USER WHERE user_name= _name1) AND (SELECT user_id FROM USER WHERE user_name= _name2))

   ELSE (T2.user_id BETWEEN (SELECT user_id FROM USER WHERE user_name= _name2) AND (SELECT user_id FROM USER WHERE user_name= _name1))

   END)
ORDER BY
T1.lvl
DESC
宾果@maulik

我已经找到了在2个节点之间查找多个步骤的解决方案。 我对您的查询做了一些更改,使之更容易

select  count(DISTINCT(parent_user_id)) -1 as Step_Difference
  from    (select * from USER
          order by parent_user_id, user_id) products_sorted,
         (select @pv := 0) initialisation
  where   find_in_set(parent_user_id, @pv)
  and     length(@pv := concat(@pv, ',', user_id))
  AND
  (CASE
      WHEN (SELECT user_id FROM USER WHERE user_name= _name1) < (SELECT user_id FROM USER WHERE user_name= _name2) AND  (SELECT COUNT(user_id) FROM USER WHERE(SELECT user_id FROM USER WHERE user_name = _name1) IN( SELECT parent_user_id FROM USER) ) > 0
          THEN (user_id BETWEEN (SELECT user_id FROM USER WHERE user_name= _name1) AND (SELECT user_id FROM USER WHERE user_name= _name2))

      WHEN (SELECT user_id FROM USER WHERE user_name= _name2) < (SELECT user_id FROM USER WHERE user_name= _name1) AND  (SELECT COUNT(user_id) FROM USER WHERE(SELECT user_id FROM USER WHERE user_name = _name2) IN( SELECT parent_user_id FROM USER) ) > 0
            THEN (user_id BETWEEN (SELECT user_id FROM USER WHERE user_name= _name2) AND (SELECT user_id FROM USER WHERE user_name= _name1))

      ELSE (user_id = 1)

  END)

非常相似的问题已经问过@Tommassiov这是一个问题,而不是一个答案发布你的问题你想做什么try@Aaryan我已经在我的问题中提出了我的疑问。请告诉我我在这个问题上做错了什么
select  count(DISTINCT(parent_user_id)) -1 as Step_Difference
  from    (select * from USER
          order by parent_user_id, user_id) products_sorted,
         (select @pv := 0) initialisation
  where   find_in_set(parent_user_id, @pv)
  and     length(@pv := concat(@pv, ',', user_id))
  AND
  (CASE
      WHEN (SELECT user_id FROM USER WHERE user_name= _name1) < (SELECT user_id FROM USER WHERE user_name= _name2) AND  (SELECT COUNT(user_id) FROM USER WHERE(SELECT user_id FROM USER WHERE user_name = _name1) IN( SELECT parent_user_id FROM USER) ) > 0
          THEN (user_id BETWEEN (SELECT user_id FROM USER WHERE user_name= _name1) AND (SELECT user_id FROM USER WHERE user_name= _name2))

      WHEN (SELECT user_id FROM USER WHERE user_name= _name2) < (SELECT user_id FROM USER WHERE user_name= _name1) AND  (SELECT COUNT(user_id) FROM USER WHERE(SELECT user_id FROM USER WHERE user_name = _name2) IN( SELECT parent_user_id FROM USER) ) > 0
            THEN (user_id BETWEEN (SELECT user_id FROM USER WHERE user_name= _name2) AND (SELECT user_id FROM USER WHERE user_name= _name1))

      ELSE (user_id = 1)

  END)