Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.
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:
R: 2 votos para modelo 1
R: 2 votos para alarme
2 votos para trava
Espero que tenha me expressado melhor. Novamente, agradeço a ajuda.
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.
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.
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.
Só contar.
SELECT id_modelo , count(*) votos
FROM voto
GROUP BY id_usuario
ORDER BY 2 desc,1;
>
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.
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 :
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.
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ó?
Não seria necessário pois o sistema não permite o usuário votar mais de uma vez. O único problema é esse mesmo, essa duplicação quando se escolhe mais de uma característica.
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.
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.
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.
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.
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.