Получить все товары из данной коллекции

У меня есть таблица 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.

Боковое примечание: у вас есть фигурные цитаты ‘ ’ --- . Это вызовет ошибки синтаксического анализа, просто говоря.

Funk Forty Niner 19.12.2018 18:23

спасибо, что подняли это ... отредактировал ...

barudo 19.12.2018 18:26

Добро пожаловать. Да, на всякий случай, если у кого-то сложится неправильное впечатление.

Funk Forty Niner 19.12.2018 18:27

нет выбранного ответа о том, как создать иерархический рекурсивный запрос MySQL ... проверка другого ...

barudo 19.12.2018 18:46

Mysql select recursive get all child with multi level звуки, к сожалению, многообещающие, он будет включать детей, которые имеют type = 'collection'.

barudo 19.12.2018 18:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
5
61
1

Ответы 1

да, вам может потребоваться использовать подзапрос и идентификатор первой выборки, где 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 ...

barudo 19.12.2018 18:30

Другие вопросы по теме