Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Dúvida sobre query para obter o produto e seus modelos

Fiz uma query para buscar um produto, seus modelos e o nome do cliente pelo id do produto, porém não ficou muito elegante e o nome do produto e descrição ficaram repetindo algumas vezes, gostaria de saber se há uma forma mais legível de obter o retorno dessa consulta, pois estão sendo retornados 4 itens, na verdade eu gostaria de retornar apenas 1 objeto produto com nome, descricao, nomeFantasia do cliente e um array de modelos de produto.

eu consegui fazer essa separação utilizando 2 querys, porém gostaria de saber se é possível com apenas 1.

Agradeço muito se puderem ajudar!

function getProduto($id) {
        $con = conectarPDO();
        $query = $con->prepare("SELECT p.nome, p.descricao, m.nome as m_nome, m.descricao as m_descricao, m.imagem, m.preco, c.nomeFantasia FROM produto p INNER JOIN modelo_produto m ON p.produto_id = m.produto_FK INNER JOIN cliente c ON c.cliente_id = p.cliente_FK WHERE p.produto_id = $id AND p.status = 1 AND m.status = 1 AND c.status = 'ativado'");
        $query->execute();
        $resultado = $query->fetchAll(PDO::FETCH_OBJ);

        return $resultado;
    }

o retorno é o seguinte:

nome                | descricao                 | m_nome                    | m_descricao                                            |  imagem            | preco     | nomeFantasia
Esfiha de Carne     | Deliciosa carne bovina     | carne unidade            | carne, tomate e cebola                                | carne.jpg            | 2.00        | Esfiha do Mestre
Esfiha de Carne     | Deliciosa carne bovina     | carne com catupiry        | carne, tomate e cebola e catupiry                     | carne-cat.jpg    | 2.50        | Esfiha do Mestre
Esfiha de Carne     | Deliciosa carne bovina     | carne com cheddar        | carne, tomate e cebola e cheddar                    | carne-che.jpg    | 2.50        | Esfiha do Mestre
Esfiha de Carne     | Deliciosa carne bovina     | carne caixa com 10un    | carne, tomate e cebola caixa com 10 unidades    | carne10.jpg        | 18.00    | Esfiha do Mestre
3 respostas
solução!

Boa noite, Rafael, qual banco você esta utilizando?

Ainda não consegui entender o motivo de querer retornar tudo em uma linha, mas, se estiver usando o mysql tente usar o comando GROUP_CONCAT(), ou se estiver usando firebird comando List()...

Não sei para que precisa dessa consulta, mas espero ter ajudado

SELECT p.nome, p.descricao, 
       GROUP_CONCAT(m.nome) as m_nome,
       GROUP_CONCAT(m.descricao) as m_descricao, 
       GROUP_CONCAT(m.imagem), 
       GROUP_CONCAT(m.preco), 
       c.nomeFantasia 
FROM produto p 
INNER JOIN modelo_produto m ON p.produto_id = m.produto_FK 
INNER JOIN cliente c ON c.cliente_id = p.cliente_FK 
WHERE p.produto_id = 1 AND 
      p.status = 1 AND 
      m.status = 1 AND 
     c.status = 'ativado'

Boa noite Eduardo, estou utilizando MySQL.

A ideia era buscar otimização mesmo, fazer tudo em uma query invés de duas, foi mais pra saber se era possível mesmo, pra aumentar meu conhecimento nessa parte de queries um pouco mais complexas.

Fiz aqui a sua solução, deu certo, retornou os modelos em uma linha concatenados, porém a ideia era retornar um array, acredito não ser possível fazer isso a nível de banco né?

a ideia era retornar assim, por exemplo:

$produto->nome = "Esfiha de Carne";
$produto->descricao = "Deliciosa carne bovina";
$produto->nomeFantasia="Esfiha do Mestre"
$produto->modelos = [
    {
        m_nome = "carne com catupiry ",
        m_descricao = "carne, tomate e cebola e catupiry",
        m_preco="2.5",
        imagem="carne-cat.jpg"
    },
    {
        m_nome = "carne com cheddar",
        m_descricao = "carne, tomate e cebola e cheddar",
        m_preco="2.5",
        imagem="carne-che.jpg"
    }
];

Eu resolvi assim com 2 queries:

function getProduto($id) {
        $con = conectarPDO();
        $query = $con->prepare("SELECT p.nome, p.descricao, c.nomeFantasia, c.cliente_id FROM produto p INNER JOIN cliente c ON c.cliente_id = p.cliente_FK WHERE p.produto_id = $id AND p.status = 1 AND c.status = 'ativado'");
        $query->execute();
        $produto = $query->fetch(PDO::FETCH_OBJ);        
        $query2 = $con->prepare("SELECT nome, descricao, preco, imagem FROM modelo_produto WHERE produto_FK = $id");
        $query2->execute();
        $modelos = $query2->fetchAll(PDO::FETCH_OBJ);
        $produto->modelos = $modelos;
        return $produto;
    }    

Se tiver algo para acrescentar,

Agradeço a ajuda.

Boa tarde, pelo que conheço de SQL (6 anos de experiencia) o que você quer realmente não é possível com um só select.