2009-08-27 8 views
1

C'est une question un peu bizarre, mon titre est tout aussi bizarre.MySql & PHP: Comment trouver quelle ligne a un objet dans la première place d'une liste CSV?

Ceci est une application de vote, donc j'ai une table appelée bulletins qui a deux champs importants: nom d'utilisateur et bulletin de vote. Le bulletin de vote sur le terrain est un VARCHAR mais il stocke essentiellement une liste de 25 identifiants (numéros de 1 à 200) au format CSV. Par exemple, il pourrait être:

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

Et un autre pourrait avoir

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

Et ainsi de suite.

Donc donné un ID (disons 12) Je veux trouver quelle ligne (ou nom d'utilisateur) a cet ID dans le premier endroit. Donc, dans notre exemple ci-dessus, il s'agirait du premier utilisateur car il a 12 dans la deuxième position alors que le deuxième utilisateur l'a dans la troisième position. Il est possible que plusieurs personnes aient 12 en première position (disons si les utilisateurs n ° 3 et n ° 4 l'ont au n ° 1) et il est possible que personne ne se soit classé 12.

J'ai aussi besoin de faire l'inverse (qui l'a dans le pire endroit) mais je me dis si je peux comprendre un problème le reste est facile.

Je voudrais faire cela en utilisant un nombre minimal de requêtes et de déclarations, mais pour la vie de moi, je ne peux pas voir comment.

La solution la plus simple à laquelle je pensais est de traverser tous les utilisateurs de la table et de garder une trace de qui a un identifiant dans la première place. Cela fonctionnera bien pour moi maintenant mais le nombre d'utilisateurs peut augmenter de façon exponentielle.

L'autre idée que je devais faire était une requête comme ceci:

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

et si cela renvoie les résultats que je suis fait parce que la position 1 est le premier endroit. Mais si cela a donné 0 résultats que je ferais:

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

où * est un caractère générique qui correspondra à un numéro et un seul numéro (contrairement au%). Mais je ne sais pas si cela peut réellement être fait.

De toute façon, quelqu'un a-t-il des suggestions sur la meilleure façon de faire cela?

Merci

Répondre

2

Je ne suis pas sûr que je comprends bien ce que vous voulez faire - pour obtenir une liste des utilisateurs qui ont un nombre donné dans le champ de vote »ordonné par sa position dans ce domaine?

Si oui, vous devriez pouvoir utiliser la fonction MySQL FIND_IN_SET():

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

Ceci renverra toutes les lignes qui ont votre numéro (par exemple 12) quelque part au scrutin triés par la position que vous pouvez appliquer LIMIT pour réduire la nombre de lignes renvoyées

+0

Wow qui a fait le travail parfaitement. Je vous remercie! Je devrais apprendre les fonctions de MySQL. – encee

Questions connexes