这是一个奇怪的问题所以我的标题同样奇怪。
这是一个投票应用程序,所以我有一个名为选票的表,它有两个重要的字段:用户名和选票。现场选票是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,%'
其中*是一个通配符,只匹配一个数字和一个数字(与%不同)。但我不知道这是否真的可以实现。
无论如何,是否有人对如何做到这一点有任何建议?
由于
答案 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
来减少返回的行数。