【问题标题】:Voting/Ranking logic with SQL使用 SQL 进行投票/排名逻辑
【发布时间】:2012-07-22 13:33:32
【问题描述】:

我正在开展一个项目,该项目将使用比较投票逻辑将评分最高的排序到顶部,将最低的排序到底部(类似于“热与否”或“Hotstagram”)。基本上我需要做的是在数据库中随机拍摄两张彼此相邻的照片并让用户投票,为获胜者加一分,从失败者中减去一分,基本上将最高的过滤到顶部。

我的问题有两个,如何在 MySql 数据库中获取随机项,然后直接在其旁边获取随机项。其次(如果有人有这方面的经验)你将如何构建你的数据库?我在想一张用于图像的表格,另一张用于投票(然后在页面加载时编译结果)。我想我在这里关心的是,对于排名,新输入的照片将从零开始,所以你可以有 X 数量的相同排名的照片?我只是在那里抛出一些想法,我需要另一个想法来折腾这个。

【问题讨论】:

    标签: php mysql sql database voting


    【解决方案1】:

    您可以使用Order by Rand() 函数从数据库中获取随机记录。

    SELECT * FROM tbl_name ORDER BY RAND();

    您也可以很容易地将其限制为两行:

    SELECT * FROM tbl_name ORDER BY RAND() limit 2;

    然而,这将从数据库中获得两个随机行,而不是两个连续的行。

    如果您想获得两个随机的 AND 连续行,您可以运行一个查询来获取 ID,并运行一个子查询来获取它之后的下一个 ID。

    至于将数据保存在一张/两张表中,请务必将其保存在两张表中。将保存投票的第二个表与指向图像 ID 的链接链接起来。显然,根据需要在链接(和或其他字段)上添加所需的索引。

    编辑:这里是让你在一行中获得后续两行数据的代码:

    select
        a.id,
        (
            select
                min(c.id)
            from
                table1 c
            where
                c.id>a.id
            limit 1
        ) as id2
    from
        table1 a
    order by
        rand()
    limit 1;
    

    编辑 2:如果您希望它们作为单独的行来提取各种其他位,我在下面提供了查询。我使用了一个额外的子查询,就好像初始查询碰巧提取了最大值(可能在使用 rand() 的 order 时可能,然后它解决了只返回一行数据的问题。

    select
        b.id
    from
        table1 b,
        (
        select
            a.id as id
        from
            table1 a
        where
            a.id<(select max(id) from table1 limit 1)
        order by 
            rand() 
        limit 1
        ) a
    where
        b.id>=a.id
        order by
        b.id
    limit 2
    ;
    

    【讨论】:

    • 是的,不幸的是,子查询将成为唯一的选择。
    • @GThompson 好的,我现在添加查询,为您返回连续的两条记录。
    • @GThompson 我还添加了一个查询以提取不同行中的两个连续记录,并包含一个子查询以始终确保在取出随机行时获得两行数据。
    • 我能再问你一个问题吗?如果我正在跟踪以前提取的查询并试图阻止它们出现怎么办。假设我已经拉了 6 和 7 是否可以防止下一次查询?
    • @GThompson 是的,这是可能的,但这肯定不是一件简单的事情。基本上,您需要跟踪每个显示的次数,实施某种算法以增加低命中 ID 的视图等等。要了解类似的内容,请尝试搜索开源广告轮播代码。他们基本上都是通过它来实现的。
    【解决方案2】:

    这是另一种按顺序获取两个随机行的方法:

    with first as (select id
                   from table t
                   where id < (select max(id) from table)
                   order by rand()
                   limit 1
                  )
    select id
    from table t
    order by abs(id - first.id)
    limit 2
    

    至于结构化数据。您可能需要一张用于照片,一张用于用户,一张用于“优惠”(一对带有用户 ID 的照片),一张用于投票。了解用户不投票以及他们投票的内容通常变得非常重要。

    如果您想在排名相同的照片上打破平局,您可以使用照片首次进入系统的日期、报价数量或两者的某种组合。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      • 2017-02-25
      • 1970-01-01
      相关资源
      最近更新 更多