'SQL: select all depending nodes from a list of parent
let's take a table called users like this
| id | name | ... | path | 
|---|---|---|---|
| 22 | John | ... | 2/8/11/22/ | 
| 23 | Mark | ... | 1/3/9/15/21/23/ | 
where the path rapresents the hierarchy parent-child.
Now, I have a list of "special users" which we can call them "board-users" and, for semplicity, let's say they have id 1 to 10.
I would like to select all the rows which derive from the board users (including board users rows itself) and I would like to add a column related to the board users parent; something like this:
| id | name | ... | path | board_parent_id | 
|---|---|---|---|---|
| 1 | Stephany | ... | 1/ | 1 | 
| 2 | Karl | ... | 2/ | 2 | 
| ... | ... | ... | ... | ... | 
| 83 | Lucy | ... | 4/11/43/51/69/73/83/ | 4 | 
I have tried something like
SELECT u1.id as board_parent_id, u2.*
FROM USERS AS u1
CROSS JOIN USERS AS u2
WHERE u1.id = '1'
AND u2.path LIKE '%1%'
UNION
SELECT u1.id as board_parent_id, u2.*
FROM USERS AS u1
CROSS JOIN USERS AS u2
WHERE u1.id = '2'
AND u2.path LIKE '%2%'
UNION
...
but honestly I believe this is a very stupid way to do this
Solution 1:[1]
First observation:
- your current query should search for 
'%/1/%'not'%1%' - the latter will match 
'63/41/999/', when you don't want it to 
But that also means that your path should start with '/'
- or concat 
'/'to the start in your query 
If you know the list of golden id's, then it's just a join?
WITH
  golden(id) AS
(
  VALUES
    (1),(2),(3)...,(n)
)
SELECT
  golden.id   AS board_parent_id,
  users.*
FROM
  golden
INNER JOIN
  users
    ON CONCAT('/', user.path) LIKE CONCAT('%/', golden.id, '/%')
    					Solution 2:[2]
Thank to the comments and other answers I finally got my query done.
I post here an example
WITH BOARD AS(
   SELECT * FROM users 
   WHERE ID IN ('id_1', 'id_2', 'id_3', 'id_4'...)
)
SELECT BOARD.id AS board_id,
u.*
FROM users AS u 
INNER JOIN BOARD ON u.path LIKE CONCAT('%',BOARD.id.'%')
This way, it seems to work the way I wanted
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source | 
|---|---|
| Solution 1 | MatBailie | 
| Solution 2 | marc_s | 
