Ir para conteúdo

POWERED BY:

Arquivado

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

FernandoPhP

MYSQL melhorar query

Recommended Posts

Atualmente consegui o retorno que eu quero através dessa query, mas acho que dá pra fazer de uma forma melhor, alguém sabe como me ajudar nisso?

 

SELECT (

SELECT  `imagem` 
FROM  `anexos` 
WHERE  `idencomendas` =16
LIMIT 0 , 1
) AS Anexo1, (

SELECT  `imagem` 
FROM  `anexos` 
WHERE  `idencomendas` =16
LIMIT 1 , 1
) AS Anexo2, (

SELECT  `imagem` 
FROM  `anexos` 
WHERE  `idencomendas` =16
LIMIT 2 , 1
) AS Anexo3

 

Agradeço desde já pela ajuda

Compartilhar este post


Link para o post
Compartilhar em outros sites

pra que complicar ?

 

 

SELECT `imagem` FROM  `anexos` WHERE `idencomendas` = 16 LIMIT 3

use um loop para percorrer as 3 linhas retornadas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem o que eu quero é o seguinte:

 

Eu tenho várias tabelas, mas duas em especifico:

 

encomendas e anexos

 

a encomendas tem os seguintes campos

 

encomendas_id int(100) auto_increment

encomendas_idcadastro int(100)

encomendas_idmodelo int(10)

encomendas_data date

encomendas_tamanho int(5)

encomendas_rabetas int(5)

encomendas_material int(5)

encomendas_quilhas int(5)

encomendas_acabamentos int(5)

encomendas_extra int(5)

encomendas_pintura int(5)

encomendas_observacoes text

encomendas_formaspagamento int(2)

encomendas_total float(9,2)

encomendas_status int(1)

 

e anexos:

 

anexos_id int(100) auto_increment

idencomendas int(100)

imagem varchar(100)

 

as outras tabelas eu consigo selecionar juntas numa boa, eu uso a seguinte consulta para retornar todos dados da encomenda:

 

SELECT * FROM `encomendas` , `tamanho` , `rabetas` , `material` , `quilhas` , `acabamentos` , `extra` , `pintura` , `formadepagamento`

WHERE `encomendas`.`encomendas_tamanho` = `tamanho`.`tamanho_id`

AND `encomendas`.`encomendas_rabetas` = `rabetas`.`rabetas_id`

AND `encomendas`.`encomendas_material` = `material`.`material_id`

AND `encomendas`.`encomendas_quilhas` = `quilhas`.`quilhas_id`

AND `encomendas`.`encomendas_acabamentos` = `acabamentos`.`acabamentos_id`

AND `encomendas`.`encomendas_extra` = `extra`.`extra_id`

AND `encomendas`.`encomendas_pintura` = `pintura`.`pintura_id`

AND `encomendas`.`encomendas_formaspagamento` = `formadepagamento`.`formadepagamento_id`

 

Apesar de ser uma consulta grande, me retorna todos os dados que eu preciso, então teria de incluir os anexos nessa consulta, que podem ser 1 ou 2 ou 3. São identificados pelo campo idencomendas que entraria no WHERE relacionado os encomendas_id. Gostaria que cada imagem anexa, fosse retornada como se fosse uma coluna, no caso de ter apenas 1 ou 2 registros com o mesmo idencomendas na tabela anexos, a terceira coluna retornaria null.

 

Agora Expliquei toda a situação. Pensei em fazer 3 subquerys adicionando o encomendas.encomendas_id como campo para retorno e atribundo a ele uma variavel e repeti-la dentro da subquery, desta forma:

 

SELECT *, @dt := `encomendas`.`encomendas_id`, (SELECT `imagem` FROM `anexos` WHERE `idencomendas` = @dt LIMIT 0 , 1 ) AS Anexo1 FROM ...

 

E duas subquerys com de forma analoga, mas acho que ficaria um código muito grande, porisso queria saber se existe uma outra forma de fazer isso, Será que alguém pode me ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Devido a complexidade da tua consulta, talvez valha mais a pena trazer os anexos separadamente, com uma query simples, como sugeri mesmo.

 

vou mover o tópico para o fórum de MySQL, pois por lá, o pessoal é mais especialista em banco de dados.

visto que a tua dúvida não é sobre php.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nesse caso teria várias consultas, pois cada linha da tabela teria que ter uma consulta só para os anexos.

 

Com o passar do tempo e o crescimento do banco de dados, essas consultas a cada linha poderiam fazer o acesso as informações e o tempo de resposta das páginas ficarem demasiadamente lento. Porisso prefiro resolver tudo em uma consulta.

 

Da forma que eu pensei funciona, mas acredito que tenha uma forma melhor, algum recurso, função ou configuração da tabela que eu não to tendo conhecimento para aplicar.

 

Agradeço a Ajuda, se alguém souber como me ajudar eu agradeço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você tem 1 tabela encomendas ? Cada tabela encomendas você pode adicionar vários anexos para essa encomenda certo ?

 

Exemplo:

id_4 - encomenda de bolo  - encomenda
  1 - 4 - foto do bolo_1 - anexo
  2 - 4 - foto do bolo_2 - anexo
  3 - 4 - foto do bolo_3 - anexo

 

Seria isso a lógica ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

2 tabelas, encomendas e anexos.

as outras são frutos da normatização. mas se atendo a essas 2 tabelas, queria que junto com as encomendas fosse acrescentado os registros de anexos que tivessem o anexos.idencomendas em encomendas.encomendas_id. Só que não é uma união simples. Quero que na mesma linha retorne todos os registros de anexo que foram validados pela regra acima.

 

A consulta apresenta o seguinte retorno:

 

 

encomendas_id encomendas_status encomendas_idcadastro encomendas_idmodelo encomendas_data encomendas_tamanho encomendas_rabetas encomendas_material encomendas_quilhas encomendas_acabamentos encomendas_extra encomendas_pintura encomendas_observacoes encomendas_formaspagamento encomendas_total tamanho rabetas material quilhas acabamentos extra pintura formadepagamento logar

16 0 5 17 2011-06-19 19 2 1 1 1 1 1 teste 4 1373.13 6'6'' round squash Nacional Series fcs tri-quilha polimento laminação de carbono 1 lado pintado Cartão 3x master

18 0 5 17 2011-06-19 19 1 1 6 1 3 1 status 3 954.87 6'6'' squash Nacional Series future tri quilha polimento longarina de carbono pintado Cartão 2x master

4 0 5 17 2011-06-19 19 2 1 6 2 2 1 teste 9 0.00 6'6'' round squash Nacional Series future tri quilha fosca laminação de carbono 2 lados pintado 50% dinheiro + 50% c master

5 0 5 17 2011-06-19 19 2 1 6 2 2 1 teste 9 0.00 6'6'' round squash Nacional Series future tri quilha fosca laminação de carbono 2 lados pintado 50% dinheiro + 50% c master

6 0 5 17 2011-06-19 19 2 1 6 2 2 1 teste 9 0.00 6'6'' round squash Nacional Series future tri quilha fosca laminação de carbono 2 lados pintado 50% dinheiro + 50% c master

7 0 5 17 2011-06-19 19 2 1 6 2 2 1 teste 9 0.00 6'6'' round squash Nacional Series future tri quilha fosca laminação de carbono 2 lados pintado 50% dinheiro + 50% c master

8 0 5 17 2011-06-19 19 2 1 6 2 2 1 teste 4 0.00 6'6'' round squash Nacional Series future tri quilha fosca laminação de carbono 2 lados pintado Cartão 3x master

9 0 5 17 2011-06-19 19 2 1 6 2 2 1 teste 4 0.00 6'6'' round squash Nacional Series future tri quilha fosca laminação de carbono 2 lados pintado Cartão 3x master

10 0 5 17 2011-06-19 19 2 1 6 2 2 1 teste 4 0.00 6'6'' round squash Nacional Series future tri quilha fosca laminação de carbono 2 lados pintado Cartão 3x master

11 0 5 17 2011-06-19 19 2 1 6 2 2 1 teste 4 0.00 6'6'' round squash Nacional Series future tri quilha fosca laminação de carbono 2 lados pintado Cartão 3x master

12 0 5 17 2011-06-19 19 2 1 6 2 2 1 teste 4 0.00 6'6'' round squash Nacional Series future tri quilha fosca laminação de carbono 2 lados pintado Cartão 3x master

13 0 5 17 2011-06-19 19 2 1 6 2 2 1 teste 4 1915.93 6'6'' round squash Nacional Series future tri quilha fosca laminação de carbono 2 lados pintado Cartão 3x master

14 0 5 17 2011-06-19 19 2 1 6 2 2 1 testye 3 2011.72 6'6'' round squash Nacional Series future tri quilha fosca laminação de carbono 2 lados pintado Cartão 2x master

15 0 5 17 2011-06-19 19 2 1 6 2 2 1 testepp 3 1820.13 6'6'' round squash Nacional Series future tri quilha fosca laminação de carbono 2 lados pintado Cartão 2x master

17 0 5 17 2011-06-19 19 2 1 6 2 2 1 gfgdf 4 1915.93 6'6'' round squash Nacional Series future tri quilha fosca laminação de carbono 2 lados pintado Cartão 3x master

 

ou assim:

 

qrencomendas.gif

 

Não existe nenhuma conta,

 

o comando da consulta seria:

SELECT  @dt := `encomendas`.`encomendas_id`, (SELECT `imagem` FROM `anexos` WHERE `idencomendas` = @dt LIMIT 0 , 1 ) AS
Anexo1, (SELECT `imagem` FROM `anexos` WHERE `idencomendas` = @dt LIMIT 1 , 1 ) AS Anexo2, (SELECT `imagem` FROM `anexos`
WHERE `idencomendas` = @dt LIMIT 2 , 1 ) AS Anexo3,`encomendas`.*, `tamanho`.`nome` as 'tamanho', `rabetas`.`nome` as
'rabetas', `material`.`nome` as 'material', `quilhas`.`nome` as 'quilhas', `acabamentos`.`nome` as 'acabamentos', 
`extra`.`nome` as 'extra', `pintura`.`nome` as 'pintura', `formadepagamento`.`nome` as 'formadepagamento', 
`logar`.`logar_login` as 'logar'   FROM  `encomendas` ,  `tamanho` ,  `rabetas` ,  `material` ,  `quilhas` ,  `acabamentos`
,  `extra` ,  `pintura` ,  `formadepagamento` ,  `logar` WHERE  `encomendas`.`encomendas_tamanho` = 
`tamanho`.`tamanho_id` AND  `encomendas`.`encomendas_rabetas` =  `rabetas`.`rabetas_id` AND  
`encomendas`.`encomendas_material` =  `material`.`material_id` AND  `encomendas`.`encomendas_quilhas` =  
`quilhas`.`quilhas_id` AND  `encomendas`.`encomendas_acabamentos` =  `acabamentos`.`acabamentos_id` AND  
`encomendas`.`encomendas_extra` =  `extra`.`extra_id` AND  `encomendas`.`encomendas_pintura` =  `pintura`.`pintura_id` AND 
`encomendas`.`encomendas_formaspagamento` =  `formadepagamento`.`formadepagamento_id` AND  
`encomendas`.`encomendas_idcadastro` =  `logar`.`logar_id`

Fiz da forma que está acima, acho que tá bem explicado. Tem alguma forma de melhorar o desempenho e simplificar a query?

 

Ninguém sabe como poderia ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

//sei nao mas acho que vou salvar sua vida em kkkkkkkkkkkkkkkkkkk

 

faz um subselect com group_concat()

 

select

(select group_concat(minhas_imagens) as imagens_agrupadas from minha_tabela where tabela.id = minha_tabela.id )

from

tabela

 

//obs no group concat da para ordenar e trocar o delimitador...

mais instruções leia

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

 

Abraços

KUROLE

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.