2011-06-03 8 views
5

Quiero buscar algunos datos de la siguiente tabla de la base de datos 'artículo'. enter image description here¿Cuál será la consulta SQL para este problema?

quiero buscar una información del artículo cuyo category_id es 4. Pero el resultado debe contener todos los registros de sus categorías principales.

por ejemplo:
'article1' tiene el padre 'Sub Category1' y su principal es 'Main Category'. Entonces el resultado debería tener las filas 1,2,4 de la tabla.

¿Es posible escribir una consulta SQL para esto? ¿Cuál será la consulta que puede obtener datos de acuerdo con la condición anterior?

Por favor guíame ... !!

gracias ..

Respuesta

4

Por favor refiérase a este artículo: Managing Hierarchical Data in MySQL.

En realidad, se han propuesto modelo para obtener los datos jerárquicos sin recursividad. En que usan lft (izquierda) y rgt (derecha) esto para columna adicional para almacenar información estructural de la tabla. lft y rgt se configuran como sigue

Root lft es 1. luego su primer hijo lft es el siguiente número luego su hijo en el siguiente número así sucesivamente hasta que no haya ningún niño entonces para ese nodo (nodo hoja) rgt será su lft +1. Y estableceremos los hermanos lft como rgt +1 y también seguiremos las mismas reglas.

Y si la numeración de todos los del niño se hace su voluntad de establecer los padres rgt a rgt 1 del último hijo.

no he explicarlo claramente, pero en el enlace con la imagen que es más fácil de entender.

Así que después de esto se puede explorar la estructura anidada utilizando consultas siguientes

Para conseguir Identificación del todo de los padres con el fin de:

SELECT parent.category_id 
FROM article AS node, 
article AS parent 
WHERE node.lft BETWEEN parent.lft AND parent.rgt 
AND node.category_id = $category_id 
ORDER BY parent.lft; 

para eliminar cualquier fila:

LOCK TABLE article WRITE; 
SELECT @myLeft := lft, @myRight := rgt, @myWidth := rgt - lft + 1 
    FROM article WHERE category_id = 'row_id'; 
DELETE FROM article WHERE lft BETWEEN @myLeft AND @myRight; 
UPDATE article SET rgt = rgt - @myWidth WHERE rgt > @myRight; 
UPDATE article SET lft = lft - @myWidth WHERE lft > @myRight; 
UNLOCK TABLES; 

Para insertar cualquier fila:

LOCK TABLE article WRITE; 
SELECT @myLeft := lft FROM article WHERE category_id = 'parent_id'; 
UPDATE article SET rgt = rgt + 2 WHERE rgt > @myLeft; 
UPDATE article SET lft = lft + 2 WHERE lft > @myLeft; 
INSERT INTO article(title, lft, rgt) VALUES('title', @myLeft + 1, @myLeft + 2); 
UNLOCK TABLES; 

Esto es algo complejo, pero después de crear el procedimiento almacenado, no será difícil de usar.

+0

gracias por compartir .. En este artículo se dará consulta de 4 nivel de hierarachy. aquí el nivel máximo de jerarquía puede ser desconocido para diferentes 'category_id'. – Vin

2

En MS SQL 2005/2008:

with cte(category_id, parent_id, title) 
as 
(
    select category_id, parent_id, title 
    from Category 
    where category_id = 4 
    union all 
    select cat.category_id, cat.parent_id, cat.title 
    from Category cat 
     join cte on 
      cat.category_id = cte.parent_id 
) 
select * 
from cte  
1

Esto se conoce en SQL como una consulta recursiva. Oracle y Postgresql usan una sintaxis diferente de la respuesta de Alex Aza ’, y en MySQL, yo no ’ creo que puedes hacerlo en una consulta.

WITH RECURSIVE t(category_id, parent_id, title) AS 
(SELECT category_id, parent_id, title 
    from Category 
    where category_id = 4) 
UNION ALL 
SELECT c.category_id, c.parent_id, c.title 
FROM Category c, t WHERE t.parent_id=c.category_id /* ends when parent_id==-1 */ 
) 
SELECT * FROM t; 

Se requiere RECURSIVE.

0

si está utilizando SQL Server 2008 luego tratar hierarchyid MSDN

Cuestiones relacionadas