es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué no muestra todas las categorías descendientes en las migas de pan?

Cuando se busca por categoría de producto, necesito mostrar todas sus categorías padre.

Cuando hay varios niveles, solo se muestran dos resultados.

CREATE TABLE category (
id int NOT NULL,
parent_category_id int,
name varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB;

INSERT INTO category (id, parent_category_id, name) VALUES
(1, NULL, ‘Male’),
(2, 1, ‘T-shirts’),
(3, 1, ‘Shoes’),
(4, 2, ‘Tank top’),
(5, 2, ‘Basic shirts’);

SELECT CONCAT(t1.name, ‘ > ‘, t2.name) as breadcrumb
FROM category AS t1
LEFT JOIN category AS t2 ON t2.parent_category_id = t1.id
WHERE t2.id = 4; #( 4 or 5 )

Resultado: T-shirts > Tank top

Resultado esperado: Male > T-shirts > Tank top

No muestra la categoría “Male”.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para mostrar todas las categorías principales al buscar por una categoría de producto, un enfoque es utilizar la recursión. Esto nos permite recorrer la jerarquía de categorías y obtener todas las categorías principales hasta llegar a la categoría raíz.

    Aquí hay una consulta de ejemplo que utiliza recursión para obtener todas las categorías principales de una categoría dada:

    WITH RECURSIVE category_path (id, parent_category_id, name, path) AS (
      SELECT id, parent_category_id, name, name as path
      FROM category
      WHERE id = 4 -- reemplazar con el id de categoría deseado
      UNION ALL
      SELECT c.id, c.parent_category_id, c.name, CONCAT(cp.name, " > ", c.name)
      FROM category c
      JOIN category_path cp ON c.id = cp.parent_category_id
    )
    SELECT path
    FROM category_path;
    

    En esta consulta, comenzamos con la categoría dada (identificada por su id) y obtenemos su id, id de categoría padre y nombre. También creamos una nueva columna llamada “path” que contiene el nombre de la categoría. Esta será nuestra ruta de navegación comenzando desde el nodo hoja.

    Luego, utilizamos el operador UNION ALL para combinar los resultados del caso base (es decir, la categoría dada) y el caso recursivo (es decir, todas las categorías principales de la categoría dada). En el caso recursivo, unimos la tabla de categoría con la tabla de category_path y seleccionamos el id, id de categoría padre y nombre de la categoría padre. También concatenamos el camino de la categoría actual (que es el camino de su categoría padre más su propio nombre) y lo asignamos a la columna “path”.

    Finalmente, seleccionamos solo la columna “path” de la tabla category_path, que contiene todas las categorías principales de la categoría dada unidas por ” > “.

    Con esta consulta, deberíamos obtener el resultado esperado:

    Masculino > Camisetas > Camiseta sin mangas
    

    Nota que esta consulta asume que no hay referencias circulares en la jerarquía de categorías (es decir, una categoría no puede ser su propio padre). Además, si hay múltiples categorías con el mismo nombre, esta consulta puede producir resultados ambiguos.

Comments are closed.