Ir para conteúdo

POWERED BY:

Arquivado

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

BrunoOliveira

Problemas com GROUP BY (desafio)

Recommended Posts

Galera, é o seguinte.

 

Estou tentando fazer uma busca em uma estrutura de páginas em árvore, mas,

o group by ta retornando resultados ao meu ver, inconsistentes.

Não consegui descobrir o porquê.

 

Aí vai:

SELECT p.idPagina, p.pagina, p.linkFROM pagina pWHERE  (SELECT COUNT(*) FROM pagina WHERE parent_pag=p.idPagina) > 0AND parent_pag=0AND visivel_site=1+----------+---------------+-------------+| idPagina | pagina        | link        |+----------+---------------+-------------+|        1 | AgÛncia       | agencia     ||        2 | O que Fazemos | oquefazemos ||        6 | Portf¾lio     | portfolio   |+----------+---------------+-------------+

Até aí tudo bem. É o resultado esperado.

Mas, colocando o COUNT(*) e o agrupamento GROUP BY:

 

SELECT p.idPagina, p.pagina, p.link, COUNT(*) AS qtdFROM pagina pWHERE  (SELECT COUNT(*) FROM pagina WHERE parent_pag=p.idPagina) > 0AND parent_pag=0AND visivel_site=1GROUP BY p.idPagina+----------+---------------+-------------+-----+| idPagina | pagina        | link        | qtd |+----------+---------------+-------------+-----+|        1 | AgÛncia       | agencia     |   1 ||        2 | O que Fazemos | oquefazemos |   1 ||        5 | Projetos      | projetos    |   1 |+----------+---------------+-------------+-----+

Reparem que Portfólio desapareceu, e Projetos entrou no lugar...

??????????????????

 

Olha o que é mais curioso:

 

 

SELECT COUNT(*) FROM pagina WHERE parent_pag=5+----------+| COUNT(*) |+----------+|        0 |+----------+

O último registro NEM RESPEITOU O WHERE...

 

Enfim, já não sei mais o que fazer..

Qualquer ajuda será bem vinda!! :joia:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Posso não ser especialista em SQL, mas me parece meio óbvio o segundo SQL não ter "respeitado" a cláusula WHERE.

 

Veja que no primeiro SQL há a associação de parent_pag com o valor de p.idPagina, na segunda não.

 

Logo, pelo menos até onde sei, o retorno é o correto, já que a consulta está CONTANDO (COUNT) algo (*) ONDE (WHERE) NULL (parent_pag) = 5

 

Parte da solução seria isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

seu select nao faz sentido...

 

WHERE (SELECT COUNT(*) FROM pagina WHERE parent_pag=p.idPagina) > 0

 

uma subquery solta no where comparando com um numero qualquer nao vai filtrar nada

Compartilhar este post


Link para o post
Compartilhar em outros sites

Creio que se quer testar se existe registro "pai".

 

SELECT p.idPagina, p.pagina, p.link, COUNT(*) AS qtd
FROM pagina p
WHERE  parent_pag=0
AND visivel_site=1
AND EXISTS (SELECT NULL FROM pagina p2 WHERE p2.parent_pag=p.idPagina) 
GROUP BY p.idPagina

Compare com

 

SELECT p.idPagina, p.pagina, p.link
FROM pagina p
WHERE  parent_pag=0
AND visivel_site=1
AND EXISTS (SELECT NULL FROM pagina p2 WHERE p2.parent_pag=p.idPagina)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Creio que se quer testar se existe registro "pai".

 

SELECT p.idPagina, p.pagina, p.link, COUNT(*) AS qtd
FROM pagina p
WHERE  parent_pag=0
AND visivel_site=1
AND EXISTS (SELECT NULL FROM pagina p2 WHERE p2.parent_pag=p.idPagina) 
GROUP BY p.idPagina

Compare com

 

SELECT p.idPagina, p.pagina, p.link
FROM pagina p
WHERE  parent_pag=0
AND visivel_site=1
AND EXISTS (SELECT NULL FROM pagina p2 WHERE p2.parent_pag=p.idPagina)

Motta, gostei da sua solução, o sql ficou até mais elegante.

 

No entanto, e, aí que entra minha dúvida, olha os resultados do seu sql:

mysql> SELECT p.idPagina, p.pagina, p.link
    -> FROM pagina p
    -> WHERE  parent_pag=0
    -> AND visivel_site=1
    -> AND EXISTS (SELECT NULL FROM pagina p2 WHERE p2.parent_pag=p.idPagina);
+----------+---------------+-------------+
| idPagina | pagina        | link        |
+----------+---------------+-------------+
|        1 | AgÛncia       | agencia     |
|        2 | O que Fazemos | oquefazemos |
|        6 | Portf¾lio     | portfolio   |
+----------+---------------+-------------+
Q é o resultado esperado!! Os 3 registros acima têm 'filhos'.

 

Mas, qdo agrupo, denovo usando o seu sql, veja o resultado:

mysql> SELECT p.idPagina, p.pagina, p.link, COUNT(*) AS qtd
    -> FROM pagina p
    -> WHERE  parent_pag=0
    -> AND visivel_site=1
    -> AND EXISTS (SELECT NULL FROM pagina p2 WHERE p2.parent_pag=p.idPagina)
    -> GROUP BY p.idPagina;
+----------+---------------+-------------+-----+
| idPagina | pagina        | link        | qtd |
+----------+---------------+-------------+-----+
|        1 | AgÛncia       | agencia     |   1 |
|        2 | O que Fazemos | oquefazemos |   1 |
|        5 | Projetos      | projetos    |   1 |
+----------+---------------+-------------+-----+
Esse simples detalhe tirou portfólio e colocou projetos.

E, mais uma vez, o mais curioso:

mysql> SELECT NULL FROM pagina p2 WHERE p2.parent_pag=5;
Empty set (0.02 sec)

Não consigo entender. Também não sou especialista em SQL, mas,

esse de fato não consigo achar a explicação.

 

Obrigado de antemão pela ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não faz sentido, era para trazer resultados semelhantes.

 

Faça

 

select idPagina, pagina, link , count(*)
from
(
SELECT p.idPagina, p.pagina, p.link
FROM pagina p
WHERE  parent_pag=0
AND visivel_site=1
AND EXISTS (SELECT NULL FROM pagina p2 
            WHERE p2.parent_pag=p.idPagina) 
)
group by idPagina, pagina, link 

 

Compare com

SELECT *
FROM pagina p
WHERE  parent_pag=0
AND visivel_site=1
AND EXISTS (SELECT NULL FROM pagina p2 
            WHERE p2.parent_pag=p.idPagina)

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.