MySql & PHP: Как найти, какая строка занимает позицию в начале списка CSV? - PullRequest
1 голос
/ 27 августа 2009

Это довольно странный вопрос, поэтому мой заголовок такой же странный.

Это приложение для голосования, поэтому у меня есть таблица с названием бюллетени, в которой есть два важных поля: имя пользователя и бюллетень. Полевой бюллетень представляет собой VARCHAR, но в основном он хранит список из 25 идентификаторов (числа от 1 до 200) в виде CSV. Например, это может быть:

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

И еще один может иметь

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

и т. Д.

Итак, учитывая идентификатор (скажем, 12), я хочу найти, какая строка (или имя пользователя) имеет этот идентификатор в первой позиции. Таким образом, в нашем примере выше это будет первый пользователь, потому что он имеет 12 во второй позиции, тогда как второй пользователь имеет его в третьей позиции. Вполне возможно, что несколько человек могут иметь 12 в лидирующей позиции (скажем, если у пользователей № 3 и № 4 это место в месте № 1), и возможно, что никто не мог занять 12 место.

Мне также нужно сделать обратное (у кого это в худшем месте), но я полагаю, что если я смогу решить одну проблему, остальное легко.

Я хотел бы сделать это, используя минимальное количество запросов и утверждений, но на всю жизнь я не понимаю, как.

Самое простое решение, о котором я подумал, - обойти всех пользователей в таблице и отследить, кто имеет идентификатор в лидирующей позиции. Сейчас это будет хорошо работать для меня, но количество пользователей может увеличиться в геометрической прогрессии.

Другая идея, которая у меня возникла, заключалась в следующем:

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

и если это вернет результаты, я закончил, потому что позиция 1 является ведущей. Но если бы это дало 0 результатов, я бы сделал:

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

где * - подстановочный знак, который будет соответствовать только одному и одному номеру (в отличие от%). Но я не знаю, можно ли это на самом деле сделать.

В любом случае, у кого-нибудь есть предложения, как лучше всего это сделать?

Спасибо

1 Ответ

2 голосов
/ 27 августа 2009

Я не уверен, что правильно понял, что вы хотите сделать - получить список пользователей, у которых есть заданное число в поле «бюллетень», упорядоченное по его положению в этом поле?

Если это так, вы сможете использовать функцию 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

Это вернет все строки с вашим номером (например, 12) где-то в бюллетене, отсортированные по позиции, которую вы можете применить LIMIT, чтобы уменьшить количество возвращаемых строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...