【问题标题】:MySql & PHP: How to find which row has an item in the leading spot in a CSV list?MySql & PHP:如何在 CSV 列表中查找哪一行的项目位于首位?
【发布时间】:2009-08-27 03:26:15
【问题描述】:

这是一个奇怪的问题,所以我的标题也很奇怪。

这是一个投票应用程序,所以我有一个名为 ballots 的表格,其中有两个重要字段:用户名和投票。字段选票是一个 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,%'

其中 * 是一个通配符,将匹配一个数字且仅匹配一个数字(与 % 不同)。但我不知道这是否真的可以做到。

无论如何,有人对如何最好地做到这一点有任何建议吗?

谢谢

【问题讨论】:

    标签: php mysql csv


    【解决方案1】:

    我不确定我是否正确理解了您想要做什么 - 获取在“选票”字段中按其在该字段中的位置排序的给定号码的用户列表?

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

    【讨论】:

    • 哇,完美地完成了这项工作。谢谢!我应该学习 MySQL 函数..
    猜你喜欢
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 2017-01-02
    • 2014-01-02
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多