Ir para conteúdo

POWERED BY:

Arquivado

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

Marcelo de Andrade

[Resolvido] Instrução select incorreta

Recommended Posts

Boa noite! Estou com dificuldades em conseguir selecionar o modelo mais votado sem que repita o valor dele de acordo com cada usuário:

/***************** 
 TABELA VOTO
*****************/
id_usuario | id_modelo | id_caracteristica
1	   | 1	       | 2		
1	   | 1	       | 1

 

O mais próximo que consegui, foi utilizando:

SELECT id_usuario, 
id_modelo, id_caracteristica
FROM voto 
GROUP BY id_usuario ;

Mas dessa forma, uma segunda caracteristica votada foi excluida:

id_usuario | id_modelo | id_caracteristica
1	     1	         2

Preciso que ficasse de uma forma como:

id_usuario | id_modelo | id_caracteristica
1	     1	         2
                        1

 

/***************** 
 TABELA MODELO 
*****************/
id      modelo
1	gol
2	uno
3	celta
4	ka

 

/***************** 
 TABELA CARACTERISTICA
*****************/
id      caracteristica
1	basico
2	completo
3	ar
4	airbag
5	direcao
6	abs
7	alarme
8	trava
9	vidro
10	vidro

 

/***************** 
 TABELA USUARIO
*****************/
id      usuario
1	fulano
2       cicrano

 

 

Me perdoem pela confusão, pois até eu mesmo não estou entendendo o que faço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite amigo,

 

Isso:

 

id_usuario | id_modelo | id_caracteristica
1            1           2
                        1

Não é possível, agora isso:

 

id_usuario | id_modelo | id_caracteristica
1            1           2
1            1           1

É. Tente com GROUP BY id_caracteristica sozinho, ou id_caracteristica com id_usuario.

 

Espero que ajude, abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

DiegoAngra07, obrigado pela atenção. Mas não é isso, até me ajudou em outra parte. Eu sei que o exemplo que eu postei não há como ser feito, mas deixa eu tentar explicar de outra maneira.

 

Quando o usuário seleciona os dados no formulário, ele escolhe o modelo do veículo e as características que deseja. Ao computar o voto, é inserido o modelo que foi selecionado e as caracteristicas, por exemplo:

 

 

O usuário ID = 1, selecionou o carro de modelo = 1 com duas caracteristicas: alarme e trava eletrica. O sistema irá salvar na tabela voto:

id_usuario | id_modelo | id_caracteristica
1            1           2                
1            1           1

 

O id_modelo é duplicado. Creio que há outra forma de melhorar a modelagem, mas enfim. Quando outro usuario insere o seu voto, a tabela fica, por exemplo:

id_usuario | id_modelo | id_caracteristica
1            1           2                
1            1           1
2            1           1
2            1           2

 

O segundo usuário, escolheu o mesmo modelo com as mesmas caracteristicas. Como posso obter o resultado dessa votacao, sem duplicar os valores do id_modelo? Com base no exemplo acima:

 

- Qual o modelo mais procurado?

R: 2 votos para modelo 1

 

- Quais caracteristicas mais procuradas?

R: 2 votos para alarme

2 votos para trava

 

 

Espero que tenha me expressado melhor. Novamente, agradeço a ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendo amigo.

 

Vou replicar a tua estrutura aqui no meu banco e fazer uns testes pra ver qual a melhor maneira de te atender. Até breve.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, com este SELECT tu pode selecionar cada modelo e a quantidade de votos pra eles, ordenando em forma descresente (maiores primeiro e menores por último):

 

SELECT id_modelo, COUNT(id_modelo)
FROM voto 
GROUP BY id_modelo ASC
ORDER BY COUNT(id_modelo) DESC;

Para trazer apenas o mais votado basta acrescentar um LIMIT na instrução:

 

SELECT idModelo, COUNT(idModelo)
FROM voto 
GROUP BY idModelo ASC
ORDER BY COUNT(idModelo) DESC
LIMIT 1;

E tu pode fazer a mesma coisa com as características, só trocar o nome dos campos. Era isso que desejava? Ou você quer trazer tudo numa instrução SQL só?

 

Abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado novamente, mas ainda não é o que procuro.

 

Fazendo da seguinda forma:

SELECT id_usuario, id_modelo
FROM voto 
GROUP BY id_modelo, id_usuario asc
ORDER BY id_modelo desc;

Ele me retorna:

id_usuario | id_modelo
25	     4
35	     4
24	     3
1	     1
24	     1
35	     1

No resultado acima, ele me diz que o id_modelo 4 foi votado duas vezes e etc. Gostaria de contar, com esse resultado para que me fosse exibido:

 

id_modelo 1 - recebeu 3 votos

id_modelo 4 - recebeu 2 votos

id_modelo 3 - recebeu 1 voto

 

Me perdoem se não estou sendo claro quanto a minha dúvida.

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só contar.

 

SELECT id_modelo , count(*) votos
FROM voto 
GROUP BY id_usuario 
ORDER BY 2 desc,1;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado novamente, mas ainda não é o que procuro.

 

Fazendo da seguinda forma:

SELECT id_usuario, id_modelo
FROM voto 
GROUP BY id_modelo, id_usuario asc
ORDER BY id_modelo desc;

Ele me retorna:

id_usuario | id_modelo
25	     4
35	     4
24	     3
1	     1
24	     1
35	     1

No resultado acima, ele me diz que o id_modelo 4 foi votado duas vezes e etc. Gostaria de contar, com esse resultado para que me fosse exibido:

 

id_modelo 1 - recebeu 3 votos

id_modelo 4 - recebeu 2 votos

id_modelo 3 - recebeu 1 voto

 

Me perdoem se não estou sendo claro quanto a minha dúvida.

 

Obrigado.

O SELECT com GROUP BY que eu te passei não tava contando? Pra mim ele contou certo, numa coluna exibe o id_modelo e na outra um COUNT.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, Diego... Ele conta, mas repetindo os resultados. Vamos lá:

 

SELECT id_modelo, COUNT(id_modelo)
FROM voto 
GROUP BY id_modelo ASC
ORDER BY COUNT(id_modelo) DESC;

Resultado:

id_modelo  count(id_modelo)
1	  6
4	  2
3	  1

Até aqui tranquilo, me tras a contagem OK. Mas se você perceber na tabela voto:

 

id_usuario id_modelo id_caracteristica
1	   1	       2
--------------------------
24	   1	       3
24	   1	       4
24	   1	       5
------------------------
25	   4	       1
35	   4	       1
35	   1	       2
1	   1	       1
24	   3	       6

 

O usuário ID 24 votou no AUTOMOVEL MODELO 1 com 3 CARACTERISTICAS. E a contagem faz com que essa repeticao seja contada. Como eu mencionei, creio que a minha modelagem possa estar incorreta. Já fiz várias experiências e nenhuma atingiu o resultado esperado.

 

Obs:

O INSERT ocorre da seguinte forma pelo sistema :

- é capturado o modelo do automovel;

- caso ele marque mais de um checkbox, ele faz um loop e insere, repetindo o id_usuario e id_modelo.

 

Estou testando como posso refazer isso de uma melhor forma.

 

Obrigado pela ajuda.

 

Só contar.

 

SELECT id_modelo , count(*) votos
FROM voto 
GROUP BY id_usuario 
ORDER BY 2 desc,1;

 

Obrigado pela ajuda, Motta. Infelizmente não é o resultado esperado como mencionei na resposta acima ao Diego.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah, entendi melhor agora. Tu não quer então efetivamente contar o id_modelo. Se o cara votou no modelo A com 4 características, isso é contabilizado como apenas 1 voto certo?

 

Eu te pergunto, e se o cara votar 2 vezes no mesmo modelo, com características diferentes. Tipo hoje eu votei no modelo A com características 1 2 e 3, e amanhã votei no A de novo com a característica 4. Isso tudo tu quer contabilizar como 1 voto só?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendo. Bom, com COUNT não será possível então eu acho. Acho que ficaria melhor tu fazer isso via programação, não consigo pensar em uma query pra resolver isso agora, quem sabe esteja óbvia mas não vem a minha cabeça nesse momento, sinto muito.

 

Vamos ver se alguém tem a solução.

Compartilhar este post


Link para o post
Compartilhar em outros sites

1º Contar os votos distintos

 

select idusuario, idmodelo 
from voto
group by idusuario, idmodelo 

 

2º Usar isto como uma tabela

 

select idmodelo, count(*) votos
from 
(
select idusuario, idmodelo 
from voto
group by idusuario, idmodelo 
) virtual
group by idmodelo
order by 2 desc,1

 

Creio ser isto, não entrei no mérito do modelo, mas talvez vala pensar aí as 4ªs e 5ªs Formas Normais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito obrigado pelo ajuda, Motta e Diego. Motta a sua solução com uma coluna(?) virtual funcionou perfeitamente, o comando

select idmodelo, count(*) votos
from 
(
select idusuario, idmodelo 
from voto
group by idusuario, idmodelo 
) virtual
group by idmodelo
order by 2 desc,1

Me retornou:

id_modelo  votos
1	   3
4	   2
3	   1

 

Estou estudando agora como funciona o comando virtual pois nunca vi/ouvi/mexi. E também consegui unir com a tabela modelo caso queira obter o nome dos modelos.

 

Dúvida sanada e problema resolvido. Obrigado novamente, abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Virtual é apenas o alias da tabela virtual montada no Select

(
select idusuario, idmodelo 
from voto
group by idusuario, idmodelo 
) 

, o Mysql parece que obriga que esta "tabela" tenha um alias.

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.