使用SQL进行投票/排名逻辑

时间:2012-07-22 13:33:32

标签: php mysql sql database voting

我正在开发一个项目,该项目将使用比较投票逻辑将最高评级排序到顶部,从最低到最低排序(类似于“热门或非热门”或“Hotstagram”)。基本上我需要做的是在数据库中拍摄两张直接相邻的随机图片并让用户投票,向胜利者添加一个点并从失败者中减去基本上过滤最高点到顶部的点。

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

2 个答案:

答案 0 :(得分:2)

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

SELECT * FROM tbl_name ORDER BY RAND();

您也可以轻松地将其限制为两行:

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

然而,这将从db获得两个随机行,而不是两个连续的行。

如果您想获得两个随机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()顺序时可能然后它解决了只返回一行数据的问题。

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
;

答案 1 :(得分:1)

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

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的照片),一个用于投票。了解用户投票的内容以及他们投票的内容通常变得非常重要。

如果您想打破具有相同排名的照片上的关系,您可以使用照片首次进入系统的日期,优惠数量或两者的某种组合。