Ir para conteúdo

Arquivado

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

Foxbh

Duplo ALIAS

Recommended Posts

Galera, desculpa o incomodo, mais e que to apanhando aqui para dar um ALIAS Duplo nesta consulta

Tenho uma tabela chamada carros, e cada carro pode ser avaliada por diferentes usuários, ate ai tudo bem, criei uma tabela secundaria chamada avaliações e cada carro pode ser avaliado por vários usuários diferentes.

Agora preciso que cada carro mostre uma avaliação geral, que e pegar todas as avaliações de todos os usuários em um determinado carro e mostrar em uma lista com todos os carros.

Ai que esta minha duvida, como recuperar as avaliações da tabela avaliação. e quantas pessoas votaram

Inseri a Tabela para melhor entender, vou pegar so a somatória da avaliação geral e quantas pessoas avaliaram o mesmo carro exemplo

Com este SELECT eu consigo pegar o que eu preciso, mais não estou consegindo exibir a quantidade de avaliações ( geral_ava )

 

 

Aqui esta o exemplo do codigo funcionando

http://sqlfiddle.com/#!9/23cfaf/6

SELECT *, (SELECT COUNT(*) FROM avaliacao WHERE id_car_ava=id_car ),(SELECT SUM(geral_ava) FROM avaliacao WHERE id_car_ava = id_car ) AS QT FROM carros

As tabelas do BD são estas

CREATE TABLE IF NOT EXISTS `avaliacao` (
  `id_ava` int(11) NOT NULL,
  `id_car_ava` int(11) NOT NULL,
  `id_usu_ava` int(11) NOT NULL,
  `dirigibilidade_ava` int(11) NOT NULL,
  `estabilidade_ava` int(11) NOT NULL,
  `potencia_ava` int(11) NOT NULL,
  `consumo_ava` int(11) NOT NULL,
  `geral_ava` int(11) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;

--
-- Extraindo dados da tabela `avaliacao`
--

INSERT INTO `avaliacao` (`id_ava`, `id_car_ava`, `id_usu_ava`, `dirigibilidade_ava`, `estabilidade_ava`, `potencia_ava`, `consumo_ava`, `geral_ava`) VALUES
(1, 1, 2, 4, 2, 2, 4, 4),
(2, 1, 6, 4, 4, 5, 5, 5),
(3, 2, 7, 5, 5, 5, 4, 3),
(4, 3, 9, 4, 4, 4, 4, 3);

-- --------------------------------------------------------

--
-- Estrutura da tabela `carros`
--

CREATE TABLE IF NOT EXISTS `carros` (
  `id_car` int(11) NOT NULL,
  `model_car` varchar(200) NOT NULL,
  `ano_car` int(12) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;

--
-- Extraindo dados da tabela `carros`
--

INSERT INTO `carros` (`id_car`, `model_car`, `ano_car`) VALUES
(1, 'Golf', 2000),
(2, 'Pálo', 1998),
(3, 'Jeta', 2015),
(4, 'Peugeout 206', 2006);

--
-- Indexes for dumped tables
--

--
-- Indexes for table `avaliacao`
--
ALTER TABLE `avaliacao`
  ADD PRIMARY KEY (`id_ava`);

--
-- Indexes for table `carros`
--
ALTER TABLE `carros`
  ADD PRIMARY KEY (`id_car`);

--
-- AUTO_INCREMENT for dumped tables
--

--
-- AUTO_INCREMENT for table `avaliacao`
--
ALTER TABLE `avaliacao`
  MODIFY `id_ava` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=5;
--
-- AUTO_INCREMENT for table `carros`
--
ALTER TABLE `carros`
  MODIFY `id_car` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=5;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sua dúvida não ficou clara. O que quer dizer com "alias duplo"?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sua dúvida não ficou clara. O que quer dizer com "alias duplo"?

Eu vou editar a pergunta, estava tentando colocar o codigo funcionando no sqlfiddle mais não deu!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Utilize JOINs no lugar de sub-select.

 

Se for utilizar somente através de SQL, você precisará realizar duas queries, uma para retornar todos os resultados e outra para exibir as avaliações.

 

Já no PHP, você pode usar a função PDO::rowCount() ou MySQLi::num_rows.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na verdade, eu preferiria que ficase em uma SQL , acho que os JOIN's não resolveriam

Mais de qualquer forma, consegui resolver, alias com umas dicas eu consegui solucionar, hehe, no final agente sempre pensa, porque não tentei isso antes!! :wacko:

A solução era simples, eu so não estava conseguindo executar

SELECT *, (SELECT COUNT(*) FROM avaliacao WHERE id_car_ava=id_car ) AS nome,
		(SELECT SUM(geral_ava) FROM avaliacao WHERE id_car_ava = id_car ) AS QT
	FROM carros

Compartilhar este post


Link para o post
Compartilhar em outros sites

Por que não resolveriam?

 

Veja só:

 

Todas as avaliações de um carro.

'SELECT
    *
FROM
    carro
    INNER JOIN avaliacao ON (carro.id = avaliacao.carro_id)
WHERE
    carro.id = 1;'    

Quantidade de registros para um carro (nem precisa de JOIN):

'SELECT
    count(*)
FROM
    carro
    INNER JOIN avaliacao ON (carro.id = avaliacao.carro_id)
WHERE
    carro.id = 1;'

Se você quiser a quantidade de avaliações por carros:

'SELECT
    carro.id,
    count(avaliacao.id),
    sum(avaliacao.nota)
FROM
    carro
    INNER JOIN avaliacao ON (carro.id = avaliacao.carro_id)
GROUP BY
    carro.id;'

Lembrando apenas que não utilizei a estrutura apresentada, apenas criei exemplos hipotéticos.

 

Normalmente sub-selects criam um overhead de informação, pois cada select é uma nova consulta. Mas depende muito do SGBD e estrutura criada (além de indexes, etc..).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Lembrando apenas que não utilizei a estrutura apresentada, apenas criei exemplos hipotéticos.

 

Normalmente sub-selects criam um overhead de informação, pois cada select é uma nova consulta. Mas depende muito do SGBD e estrutura criada (além de indexes, etc..).

Desculpe se me expressei mal Gabriel, se disse não resolveria, entenda-se quando me expressei nao seria necessário.

 

talves também pq nao expliquei a real situação, por ser um simples trabalho apenas para apresentação, não precisaria de muita coisa.

 

Te agradeço pelas soluções que voce passou. e mais uma vez, Mil desculpas se me expressei mal!

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por joao b silva
      Tenho uma pequena aplicação em php que gera arquivos pdf com a MPDF e envia email com a PHPMAILER. De repente a app parou de enviar os emails  e apresenta a seguinte mensagem de erro:
       
      Error PHPMailer: SMTP Error: Could not authenticate.
       
      Faço uso de um hotmail para a configuração do PHPMAILER.
    • Por violin101
      Caros amigos, saudações.
       
      Gostaria de tirar uma dúvida com os amigos.
       
      Quando programava em DOS. utilizava algumas teclas de atalho para: SALVAR / EDITAR / EXCLUIR / IMPRIMIR.
      Por exemplo:
      Salvar ----> ALT+S
      Editar ----> ALT+E
      Excluir --> ALT+X
      Imprimir -> ALT+I

      no PHP tem como colocar esses ATALHOS nos button, para o usuário trabalhar com esses atalhos e como seria ?

      grato,
       
      Cesar
    • Por violin101
      Caros Amigos, saudações.
       
      Por favor, me perdoa em postar uma dúvida.
       
      Preciso criar uma Rotina onde o usuário possa buscar na Base de Dados de Produtos, tanto por Código e Descrição, ou seja:
      - caso o usuário digita o Código, mostra os dados do Produto.
      - caso o usuário digita a Descrição, mostra os dados do Produto
       
      Fiz uma Rotina, onde o usuário digita a DESCRIÇÃO com a função AUTOCOMPLETE.    <=== está funcionando certinho.
       
      Minha dúvida é como faço para DIGITAR o Código e mostrar os dados também.
       
      o meu AutoComplete na MODEL está assim.
      public function autoCompleteProduto($q){ $this->db->select('*' ) ->from('produtos') ->where('produtos.statusProd',1) ->like('descricao', $q) ->limit(5) ->order_by('descricao', 'ASC'); $query = $this->db->get(); if ($query->num_rows() > 0) { foreach ($query->result_array() as $row) { $row_set[] = ['label' => str_pad($row['idProdutos'], '5', '0', STR_PAD_LEFT).' - '.$row['descricao'], 'id' => $row['idProdutos'], 'descricao' => $row['descricao'], 'cod_interno' => $row['cod_interno'], 'prd_unid' => $row['prd_unid'], 'estoque_atual' => $row['estoque_atual'] ]; } echo json_encode($row_set); } }  
       
      no CONTROLLER está assim:
      public function autoCompleteProduto() { $this->load->model('estoque/lancamentos_model'); if (isset($_GET['term'])) { $q = strtolower($_GET['term']); $this->lancamentos_model->autoCompleteProduto($q); } }  
       
      na VIEW está assim:
      <div class="col-md-10"> <label for="idProdutos">Produto:</label> <input type="hidden" name="idProdutos" id="idProdutos"> <input type="text" class="form-control" id="descricao" name="descricao" style="font-size:15px; font-weight:bold;" placeholder="Pesquisar por descrição do produto" disabled> </div>  
      VIEW + JAVASCRIPT
       
      //Função para trazer os Dados pelo o AutoComplete. function resolveAutocomplete() { $("#descricao").autocomplete({ source: "<?php echo base_url(); ?>estoque/lancamentos/autoCompleteProduto/", minLength: 2, select: function (event, ui) { $("#idProdutos").val(ui.item.id); $("#cod_interno").val(ui.item.cod_interno); $("#descricao").val(ui.item.descricao); $("#prd_unid").val(ui.item.prd_unid); $("#estoque_atual").val(ui.item.estoque_atual); $("#qtde").focus(); } }); } // inicia o autocomplete resolveAutocomplete();  
      Grato,
       
      Cesar
    • Por belann
      Olá!
       
      Estou tentando criar um projeto laravel e está dando o seguinte erro 
      curl error 60 while downloading https://getcomposer.org/versions: SSL certificate problem: unable to get local issu
        er certificate
      Já tentei atualizar o composer, mas dá o mesmo erro acima.
    • Por violin101
      Caros amigos, saudações.
       
      Estou com uma dúvida de validação de INPUT com função moeda.
       
      Tenho um input onde o usuário digita um valor qualquer, por exemplo: 1.234,56
      o problema é quando precisa atualizar o valor.
       
      Quando o usuário atualizar o input fica assim: 1.234,
       
      como faço para atualizar as casas decimais, conforme o valor for sendo alterado ?
       
      o input está assim:
       
      <div class="col-md-2"> <label for="">Valor Unitário</label> <input type="text" class="form-control" id="estoqprod" name="estoqprod" style="font-size:15px; font-weight:bold; width:100%; text-align:center;" placeholder="0,00" OnKeyUp="calcProd();" onkeypress="return(FormataMoeda(this,'.',',',event))" > </div>  
      a função para formatar o input para moeda está assim:
      obs.: a Função CalcProd está executando corretamente
      function calcProd(){ //Obter valor digitado do produto var estoq_prod = document.getElementById("estoqprod").value; //Remover ponto e trocar a virgula por ponto while (estoq_prod.indexOf(".") >= 0) { estoq_prod = estoq_prod.replace(".", ""); } estoq_prod = estoq_prod.replace(",","."); //Obter valor digitado do produto var prod_qtde = document.getElementById("qtde").value; //Remover ponto e trocar a virgula por ponto while (prod_qtde.indexOf(".") >= 0) { prod_qtde = prod_qtde.replace(".", ""); } prod_qtde = prod_qtde.replace(",","."); //Calcula o Valor do Desconto if (prod_qtde > 0 && estoq_prod > 0) { calc_total_produto = parseFloat(prod_qtde) - parseFloat(estoq_prod); var numero = calc_total_produto.toFixed(2).split('.'); //Calculo para não deixar GRAVAR valores negativos if (calc_total_produto < 0 ) { numero[0] = numero[0].split(/(?=(?:...)*$)/).join('.') * -1; document.getElementById("qtdeTotal").value = numero.join(','); } else { numero[0] = numero[0].split(/(?=(?:...)*$)/).join('.'); document.getElementById("qtdeTotal").value = numero.join(','); } } else { if (estoq_prod > 0) { document.getElementById("qtdeTotal").value = document.getElementById("estoqprod").value; } else { document.getElementById("qtdeTotal").value = "0,00"; } } } /*---Função para Formatar Campo para Moeda [R$]---*/ function FormataMoeda(objTextBox, SeparadorMilesimo, SeparadorDecimal, e){ var sep = 0; var key = ''; var i = j = 0; var len = len2 = 0; var strCheck = '0123456789'; var aux = aux2 = ''; var whichCode = (window.Event) ? e.which : e.keyCode; if (whichCode == 13) return true; key = String.fromCharCode(whichCode); // Valor para o código da Chave if (strCheck.indexOf(key) == -1) return false; // Chave inválida len = objTextBox.value.length; for(i = 0; i < len; i++) if ((objTextBox.value.charAt(i) != '0') && (objTextBox.value.charAt(i) != SeparadorDecimal)) break; aux = ''; for(; i < len; i++) if (strCheck.indexOf(objTextBox.value.charAt(i))!=-1) aux += objTextBox.value.charAt(i); aux += key; len = aux.length; if (len == 0) objTextBox.value = ''; if (len == 1) objTextBox.value = '0'+ SeparadorDecimal + '0' + aux; if (len == 2) objTextBox.value = '0'+ SeparadorDecimal + aux; if (len > 2) { aux2 = ''; for (j = 0, i = len - 3; i >= 0; i--) { if (j == 3) { aux2 += SeparadorMilesimo; j = 0; } aux2 += aux.charAt(i); j++; } objTextBox.value = ''; len2 = aux2.length; for (i = len2 - 1; i >= 0; i--) objTextBox.value += aux2.charAt(i); objTextBox.value += SeparadorDecimal + aux.substr(len - 2, len); } return false; }  
      Grato,
       
      Cesar
×

Informação importante

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