0

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

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

4

2 回答 2

2

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

SELECT * FROM tbl_name ORDER BY RAND();

您也可以很容易地将其限制为两行,如下所示:

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

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

如果您想获得两个随机和连续的行,您可以运行一个查询来获取 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
;
于 2012-07-22T13:37:07.643 回答
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 的照片),一张用于投票。了解用户不投票以及他们投票的内容通常变得非常重要。

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

于 2012-07-22T14:36:49.680 回答