Ir para conteúdo

POWERED BY:

Arquivado

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

Maykel-ctba

Adicionar subquery - como fazer?

Recommended Posts

Fala galera,

 

Tenho a seguinte consulta:

SELECT * 
FROM sistema_produto p,
     sistema_produto_secao ps,
     sistema_secao s
WHERE proAtivo = 'S' 
AND proExcluido = 'N' 
AND p.proId = ps.proId 
AND s.secId = ps.secId 
AND s.secAlias = 'luvas' 
ORDER BY p.proTItulo ASC

Essa consulta me traz uma lista de produtos.

 

No meu código, através dos resultados destas consultas, trago uma imagem (tabela sistema_produto_imagem) e uma outra seção adicional correspondente (sistema_produto_secao).

// * Consulta da seção adicional
SELECT * 
FROM sistema_produto_secao ps, sistema_secao s 
WHERE secTipo = 'P' 
AND proId = 39 // * ID gerado da primeira consulta
AND ps.secId = s.secId 
ORDER BY secTitulo ASC LIMIT 0,1

// * Consulta da imagem
SELECT * FROM sistema_produto_imagem 
WHERE proId = 39 // * ID gerado da primeira consulta
ORDER BY priOrdem 
ASC LIMIT 0,1

Só que, devido a quantidade de produtos na página, essa quantidade de consultas ficou inviável (160 produtos * consulta de imagem * consulta de seção adicional correspondente).

 

Eu consigo reduzir estas consultas em uma só, através de subquerys? Se sim, como faço?

Caso não sejam subquerys, como poderia fazer? Joins?

Compartilhar este post


Link para o post
Compartilhar em outros sites

EDIT:

 

Tentei isso, mas sem sucesso:

SELECT * 
FROM sistema_produto p, 
          sistema_produto_secao ps, 
          sistema_secao s,
          (
              SELECT priPath 
              FROM sistema_produto_imagem 
              WHERE proId = sistema_produto.proId
              ORDER BY priOrdem 
              ASC LIMIT 0,1
          ) as proImagem

WHERE proAtivo = 'S'
AND proExcluido = 'N'
AND p.proId = ps.proId
AND s.secId = ps.secId
AND s.secAlias = 'luvas'
ORDER BY p.proTItulo ASC 

#1054 - Unknown column 'sistema_produto.proId' in 'where clause'

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sem entrar no mérito da performance , tente

...
WHERE proId = p.proId
...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mesma coisa, @Motta.

Na real, já acabei de ver o erro. Coloquei a subquery no lugar errado!

SELECT 
    p.*, 
    ps.*, 
    s.*,
    (
		SELECT priPath 
		FROM sistema_produto_imagem pi
		WHERE pi.proId = p.proId
		ORDER BY priOrdem 
		ASC LIMIT 0,1
    ) as proImagem,
    (
		SELECT secTitulo
		FROM sistema_produto_secao ps, sistema_secao s 
		WHERE secTipo = 'P' 
		AND ps.proId = p.proId
		AND ps.secId = s.secId 
		ORDER BY secTitulo ASC LIMIT 0,1
    ) as proSecaoCat

FROM sistema_produto p, 
     sistema_produto_secao ps, 
     sistema_secao s

WHERE proAtivo = 'S'
AND proExcluido = 'N'
AND p.proId = ps.proId
AND s.secId = ps.secId
AND s.secAlias = 'luvas'
ORDER BY p.proTItulo ASC 

Funcionou like a boss! Isso já me economizaria um bocado em performance, acredito.

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.