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 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
    • 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
    • Por violin101
      Caros amigos, saudações.
       
      Desculpa postar minha dúvida, fiz várias pesquisa mas não tive sucesso.
       
      Como faço para capturar o ID do SELECT selecionado e passar para base_url ?
       
      Exemplo:
      após selecionar o ID passar para <?php echo base_url();?>estoque/ajuste/adicionar/ <== passar o ID aqui.
       
      <div class="col-md-6"> <label for="tipoDepart" class="control-label">Departamento:</label> <select name="tipoDepart" id="tipoDepart" style="width:100%;" class="form-control"> <option value="">Selecione um Departamento</option> <?php foreach ($dprts as $dp) { echo '<option value="'.$dp->idDepartamento.'">'.$dp->departamento.'</option>'; } ?> </select> </div> <div class="col-md-6"> <div class="card card-entrad"> <div class="card-header"> <label class="card-tlentr">Entrada - Estoque</label> </div> <div class="card-body"> <div style="text-align:center;"> <a href="<?php echo base_url();?>estoque/ajuste/adicionar/" <== COMO PASSO O ID SELECIONADO AQUI, PARA ABRIR A PÁGINA COM O ID DO DPTO ? class="btn btn-cinza">Adicionar</a> </div> </div> </div> </div>  
      Observação: preciso capturar e passar o ID para gerar TABELA referente a cada departamento.
       
      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Tem como passar para o Formulário um Campo vindo via AJAX no formato moeda ?
       
      Tenho uma rotina onde o usuário escolhe através de uma Lista na modal de Produtos e o sistema informa o formulário os seguintes campos:
      código | descrição | espécie | estoque atual.
       
      o estoque atual preciso passar nesse formato, para validação de quantidade: 15.00 ou 15,00.
      ou seja:
      converter de: 15 
      para: 15.00 com casas decimais

      tem como fazer isso ?
       
      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Tem como passar para o Formulário um Campo vindo via AJAX no formato moeda ?
       
      Tenho uma rotina onde o usuário escolhe através de uma Lista na modal de Produtos e o sistema informa o formulário os seguintes campos:
      código | descrição | espécie | estoque atual.
       
      o estoque atual preciso passar nesse formato, para validação de quantidade: 15.00 ou 15,00.

      tem como fazer isso ?
       
      Grato,
       
      Cesar
×

Informação importante

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