Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Leonardo Sampaio

Select complicado

Recommended Posts

/*

 

Tenho essa tabela de cadastros de pastas e subpastas.

Se a pasta for uma subpasta de outra então 'pastapai' será o id da pasta pai dela.

Se não for subpasta de nenhuma então 'pastapai' = 0.

 

QUESTÃO: Preciso retornar os id´s de todas as subpastas e demais dependentes de uma determinada pasta. Por exemplo: Quero os id´s de todas as dependentes pasta de id 3. A resposta seria: 8,9,11

 

Estrutura da tabela e dados pra exemplo:

 

*/

 

CREATE DATABASE pastas_issue;

USE pastas_issue;

CREATE TABLE pastas (

id INT NOT NULL AUTO_INCREMENT,

nome VARCHAR(100),

pasta_pai INT,

PRIMARY KEY (id)

);

INSERT INTO pastas VALUES

(1, 'pasta 1', 0),

(2, 'pasta 1.1', 1),

(3, 'pasta 1.2', 1),

(4, 'pasta 1.3', 1),

(5, 'pasta 1.1.1', 2),

(6, 'pasta 1.1.2', 2),

(7, 'pasta 1.1.3', 2),

(8, 'pasta 1.2.1', 3),

(9, 'pasta 1.2.2', 3),

(10, 'pasta 1.3.1', 4),

(11, 'pasta 1.2.1.1', 8);

 

ps: se isso puder ser feito apenas com SQL ótimo, senão pode usar php.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se é autoincrement não deve passar este valor. (Pastas.id)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ai tem três campos, id, nome e pasta pai. Até ai beleza. Mais como você cadastra pra saber se tal cadastro é sub pasta ou pasta pai?

Isso que expliquei no post:

Se o cadastro for filho de alguem, o campo pastapai é o id do pai.

se ele nao tiver pai nenhum, o campo pastapai é 0

fazendo um 'SELECT id FROM pastas WHERE pastapai = X' eu obtenho todos os 'filhos' diretos da pasta X, beleza. Só que preciso TAMBÉM dos 'netos' e 'bisnetos' e até onde houver filhos dos filhos da X.

 

entendeu?

 

Se é autoincrement não deve passar este valor. (Pastas.id)

É claro.

só passei os id´s pra ficar fácil de entender a relação id - pastapai do problema.

Mas eaí, alguma solução?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então no formulário suponhamos que tenha uma subcategoria (se ela for preenchida terá pasta pai):

 

$pasta_pai = !empty($_POST['sub_categoria']) ? $_POST['sub_categoria'] : 0;

 

Entendeu a lógica?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aqui vai uma demonstração da estrutura das pastas da tabela, pra ajudar.

  • pasta 1
    • pasta 1.1
      • pasta 1.1.1

      • pasta 1.1.2

      • pasta 1.1.3

    • pasta 1.2
      • pasta 1.2.1
        • pasta 1.2.1.1

      • pasta 1.2.2

    • pasta 1.3
      • pasta 1.3.1

 

Então no formulário suponhamos que tenha uma subcategoria (se ela for preenchida terá pasta pai):

 

$pasta_pai = !empty($_POST['sub_categoria']) ? $_POST['sub_categoria'] : 0;

 

Entendeu a lógica?

 

Entendi. Isso seria no cadastro de uma pasta, certo?

 

O ponto aqui é só obter uma relação de todas as pastas que dependem da pasta solicitada.(filhas em 1º nível, 2º nível, e assim por diante).

 

Fiz uma busca manual mesmo, buscando até o nivel 8 de subpastas. Se cadastrarem subpastas mais profundas terei que aumentar o código, gambira das braba mas é o jeito.

(PHP com ADODB) :

 

<?php

$deps= array();
//filhas
$filhas= $db->getAll("SELECT id FROM pastas WHERE pasta_pai = 1");
foreach( $filhas as $filha )
{
	$deps[]= $filha[id];
	//netas
	$netas= $db->getAll("SELECT id FROM pastas WHERE pasta_pai = $filha[id]");
	foreach( $netas as $neta )
	{
		$deps[]= $neta[id];
		//bisnetas
		$bisnetas= $db->getAll("SELECT id FROM pastas WHERE pasta_pai = $neta[id]");
		foreach( $bisnetas as $bisneta )
		{
			$deps[]= $bisneta[id];
			//trisnetas
			$trisnetas= $db->getAll("SELECT id FROM pastas WHERE pasta_pai = $bisneta[id]");
			foreach( $trisnetas as $trisneta )
			{
				$deps[]= $trisneta[id];
				//quadrinetas
				$quadrinetas= $db->getAll("SELECT id FROM pastas WHERE pasta_pai = $trisneta[id]");
				foreach( $quadrinetas as $quadrineta )
				{
					$deps[]= $quadrineta[id];
					//quinquanetas
					$quinquanetas= $db->getAll("SELECT id FROM pastas WHERE pasta_pai = $quadrineta[id]");
					foreach( $quinquanetas as $quinquaneta )
					{
						$deps[]= $quinquaneta[id];
						//sexanetas
						$sexanetas= $db->getAll("SELECT id FROM pastas WHERE pasta_pai = $quinquaneta[id]");
						foreach( $sexanetas as $sexaneta )
						{
							$deps[]= $sexaneta[id];
							//septanetas
							$septanetas= $db->getAll("SELECT id FROM pastas WHERE pasta_pai = $sexaneta[id]");
							foreach( $septanetas as $septaneta )
							{
								$deps[]= $septaneta[id];
							}
						}
					}
				}
			}
		}
	}
}

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.