Как я могу получить все строки, которые зависят от других строк в той же таблице? - PullRequest
0 голосов
/ 18 февраля 2020

Таким образом, у меня есть эта схема таблицы

|id| item_id | dependency_item_id | completed |

Идея состоит в том, чтобы в этой таблице были строки, указывающие на другие строки в той же таблице посредством dependency_item_id -> item_id.

Я хочу получить все записи, которые имеют dependency_item_id со значением NULL и completed со значением 0

AND

Все записи, которые у них есть родитель, строка с именем item_id = dependency_item_id, со статусом completed = 1 и статусом completed = 0

Пример:

These are the records in the database.
|id|task_id|dependency_item_id|completed|
|1 |1      |null              |1        |
|2 |2      |null              |0        |
|3 |3      |1                 |0        |
|4 |4      |2                 |0        |
|5 |5      |2                 |0        |

With the query we should get only the second record
|id|task_id|dependency_item_id|completed|
|2 |2      |null              |0        |
|3 |3      |1                 |0        |

Запрос, который я получил к этому моменту является следующим:

SELECT process.* 
    FROM tasks AS tasks 
        JOIN tasks AS dep ON dep.dependency_item_id = process.task_id 
    WHERE (dep.completed = 1 and tasks.completed = 0) OR tasks.dependency_item_id IS NULL

Ответы [ 3 ]

0 голосов
/ 18 февраля 2020

В этом случае вам потребуется коррелированный подзапрос.

Select * from items as I where (dependency_item is null and completed = 0 )
OR 
item_id in (Select item_id from items as S where I.dependency_item = S.item_id and
I.completed = 0 and S.completed = 1)`
0 голосов
/ 18 февраля 2020

Мне пришлось настроить запросы, которые вы мне дали, в соответствии с моими потребностями, потому что с данными запросами я не мог получить записи, которые имели нулевые зависимости. Мой окончательный результат был следующим:

SELECT dep.* 
    FROM tasks AS task 
        LEFT JOIN tasks AS dep ON dep.dependency_item_id = task.item_id 
    WHERE (task.completed = 1 and dep.completed = 0) 
UNION 
SELECT * FROM tasks WHERE dependency_item_id IS NULL AND completed = 0
0 голосов
/ 18 февраля 2020

Вы можете самостоятельно присоединиться к столу:

select t.*
from mytable t
left join mytable d on d.id = t.dependency_item_id
where 
    (t.dependency_item_id is null and t.completed = 0)
    or (d.dependency_item_id is null and d.completed = 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...