MySql e PHP: Como encontrar qual linha tem um item no lugar de liderança em uma lista CSV?

votos
1

Este é tipo de uma pergunta estranha assim meu título é tão estranho.

Este é um aplicativo de votação, por isso tenho uma tabela chamada cédulas que tem um dois campos importantes: nome de usuário e cédula. A cédula de campo é um VARCHAR mas basicamente armazena uma lista de 25 ids (números de 1-200) como CSVs. Por exemplo, pode ser:

22,12,1,3,4,5,6,7,...

E outro pode ter

3,4,12,1,4,5,...

E assim por diante.

Assim, dado um id (digamos 12) eu quero encontrar qual linha (ou nome de usuário) tem que id no lugar de liderança. Assim, em nosso exemplo acima seria o primeiro usuário, porque ele tem 12 na segunda posição enquanto que o segundo usuário tem na terceira posição. É possível que várias pessoas podem ter 12 na posição de liderança (por exemplo se o usuário # 3 e # 4 tê-lo em 1 º lugar) e é possível que ninguém pode ter classificado 12.

Eu também preciso fazer o inverso (que tem no pior local), mas eu acho que se eu posso descobrir um problema o resto é fácil.

Eu gostaria de fazer isso usando um número mínimo de consultas e instruções, mas para a vida de mim eu não posso ver como.

A solução mais simples eu pensava é percorrer todos os usuários na tabela e manter o controle de quem tem um id no lugar de liderança. Isto irá funcionar muito bem para mim agora, mas o número de usuários pode potencialmente aumentar exponencialmente.

A outra idéia que eu tinha era fazer uma consulta como esta:

select `username` from `ballots` where `ballot` like '12,%'

e se que retorna resultados que eu sou feito porque a posição 1 é o ponto principal. Mas se isso retornou 0 resultados que eu faria:

select `username` from `ballots` where `ballot` like '*,12,%'

onde * é um caractere curinga que irá corresponder a um número e uma número só (ao contrário do%). Mas eu não sei se isso realmente pode ser feito.

Enfim, alguém tem alguma sugestão sobre a melhor forma de fazer isso?

obrigado

Publicado 27/08/2009 em 04:26
fonte usuário
Em outras línguas...                            


1 respostas

votos
2

Eu não tenho certeza eu entendi corretamente o que você quer fazer - para obter uma lista de usuários que têm um determinado número no campo 'votação' ordenados por sua posição nesse campo?

Se assim for, você deve ser capaz de usar MySQL FIND_IN_SET()função:

SELECT username, FIND_IN_SET(12, ballot) as position 
  FROM ballots
 WHERE FIND_IN_SET(12, ballot) > 0
 ORDER BY position

Isso irá retornar todas as linhas que têm o seu número (por exemplo 12) em algum lugar, em escrutínio classificadas segundo a posição que você pode aplicar LIMITpara reduzir o número de linhas retornadas.

Respondeu 27/08/2009 em 05:01
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more