У меня есть таблица MYSQL, называемая коллекциями, при просмотре и реализации в виде таблицы, которая может быть примерно такой:
Мне нужно было знать, сможет ли один запрос mysql получить все продукты под записью типа коллекция (заданной), которая может иметь коллекции под ним. Например, если я выберу 10, он должен вернуть 14, 12, 13 и 15.
Я реализовал решение, которое включает цикл do.. while ...
$concatted = 10;
$products = [];
do {
$sql = "SELECT id, type FROM collections WHERE parent IN ($id_concatted)";
$result = $mysqli->query($sql);
if ($result) {
while($row = $result->fetch_object()){
if ($row->type == 'product') {
apply_changes_to_product($row->id);
} elseif ($row->type=='collection'){
$collections[] = $row->id;
}
}
}
if (count($collections) > 0){
$id_concatted = implode($collections, ",");
$continue = true;
$collections = [];
} else {
$continue = false;
}
} while ($continue);
Я считаю, что приведенный выше код неэффективен. Я думаю, что это можно сделать с помощью одного запроса, но я не знаю, как это сделать.
ОБНОВЛЕНИЕ: я помечаю это как дубликат Как создать иерархический рекурсивный запрос MySQL, хотя в этом посте НЕТ принятого решения. Я получил это решение на основе одного ответа (Mysql 5.6):
SELECT id, `type` FROM (
select id, `type`
from (select * from collections
order by parent, id) products_sorted,
(select @pv := '10') initialisation
where find_in_set(parent, @pv)
and length(@pv := concat(@pv, ',', id))
) products
WHERE
products.`type` = 'product'
Скрипка - http://sqlfiddle.com/#!9/ea214f/2.
спасибо, что подняли это ... отредактировал ...
Добро пожаловать. Да, на всякий случай, если у кого-то сложится неправильное впечатление.
нет выбранного ответа о том, как создать иерархический рекурсивный запрос MySQL ... проверка другого ...
Mysql select recursive get all child with multi level звуки, к сожалению, многообещающие, он будет включать детей, которые имеют type = 'collection'.






да, вам может потребоваться использовать подзапрос и идентификатор первой выборки, где parent = selectedId и type = 'collection', а затем выбрать идентификатор, где parent в идентификаторе подзапроса и type = 'product'
Как показано ниже:
SELECT id, type FROM collections WHERE parent IN (select id from collections where
parent = $id_concatted and type = 'collection') and type = 'product'
Для нескольких уровней используйте рекурсивную функцию MySql. Как показано ниже:
WITH RECURSIVE COLLECTIONS_PRODUCTS (ID, TYPE, PATH)
AS
(
SELECT ID, TYPE, CAST(ID AS CHAR(200))
FROM COLLECTIONS
WHERE PARENT IN ($id_concatted)
UNION ALL
SELECT S.ID, S.TYPE, CONCAT(M.PATH, ",", S.ID)
FROM COLLECTIONS_PRODUCTS M JOIN COLLECTIONS S ON M.ID=S.PARENT
)
SELECT * FROM COLLECTIONS_PRODUCTS WHERE TYPE = 'product' ORDER BY PATH;
это не сработает, если на входе 1 ...
Боковое примечание: у вас есть фигурные цитаты
‘ ’---“. Это вызовет ошибки синтаксического анализа, просто говоря.