首页 文章

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

提问于
浏览
0

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

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

2 回答

  • 1

    您可以使用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
    ;
    
  • 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的照片),一个用于投票 . 知道用户没有投票的内容以及他们投票的内容通常变得非常重要 .

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

相关问题