Query de hierarquia multi nível

Se por algum motivo você precisa lidar com uma query de hierarquia multi nível, em uma única tabela no MySQL e não sabe o que fazer, aqui vai uma dica.

SELECT @pv := id AS id, name,
  (SELECT count(*)
   FROM
     (SELECT *
      FROM users
      ORDER BY parent, id) x
   WHERE find_in_set(parent, @pv)
     AND length(@pv := concat(@pv, ',', id)) ) AS users_count
FROM users AS u
WHERE parent IS NULL

# Table DDL ------------------------------------

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `parent` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;

INSERT INTO `users` (name,parent) VALUES
	 ('top',NULL),
	 ('sub 1',NULL),
	 ('sub 1 - 2',1),
	 ('sub 2 ',2),
	 ('sub 2 - 1',3),
	 ('sub 3',4),
	 ('sub 4',6),
	 ('sub 5',7);

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *