MySql& PHP:如何在CSV列表中找到前导点中哪一行有项目?

时间:2009-08-27 03:26:15

标签: php mysql csv

这是一个奇怪的问题所以我的标题同样奇怪。

这是一个投票应用程序,所以我有一个名为选票的表,它有两个重要的字段:用户名和选票。现场选票是VARCHAR,但它基本上将25个ID(1-200之间的数字)列为CSV。例如,它可能是:

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

另一个人可能

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

等等。

所以给定一个id(假设12)我想找到哪个行(或用户名)在前导点中具有该id。因此,在上面的示例中,它将是第一个用户,因为他在第二个位置有12个,而第二个用户在第三个位置有它。多个人可能有12个处于领先地位(比如用户#3和#4是否在#1中有这个位置)并且可能没有人可能排名第12位。

我还需要反过来(谁在最糟糕的地方有它)但我想如果我能找出一个问题,其余的很容易。

我想用最少量的查询和陈述来做这件事,但对于我的生活,我看不出如何。

我想到的最简单的解决方案是遍历表中的所有用户,并跟踪谁在领先位置有id。这对我来说现在可以正常工作,但用户数可能呈指数级增长。

我的另一个想法是做这样的查询:

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

如果返回结果我就完成了,因为位置1是主要位置。但如果返回0结果,我会这样做:

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

其中*是一个通配符,只匹配一个数字和一个数字(与%不同)。但我不知道这是否真的可以实现。

无论如何,是否有人对如何做到这一点有任何建议?

由于

1 个答案:

答案 0 :(得分:2)

我不确定我是否理解你想要做什么 - 获得一个在“选票”字段中具有给定数字的用户列表,该字段按其在该字段中的位置排序?

如果是这样,您应该能够使用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来减少返回的行数。