0

我正在尝试为一个站点构建一个简单的随机投票系统,目前,我错误地认为,我有以下设置

当用户进入网站的随机投票部分时,他会看到一个可投票的项目,首先,这是在最长时间 agp 上最后一次投票的项目,其次,不是用户之前投票的项目,第三是必须根据他们的相关主题列表与他们相关。作为旁注,如果用户跳过投票,它不能在列表中再次向他们显示相同的东西,并且必须记录所有单票以产生统计数据。

目前,我这样做的方式是在数据库中针对他们的帐户保存一个序列化数组,其中包含他们之前投票的投票项目 ID 编号列表。在这一点上我想说的是,我不宽恕这一点,将序列化数组插入数据库是愚蠢的,我为我的行为感到遗憾;)。

不过,我想不出另一种方法来做到这一点。此时,该数组是由添加到列表中的用户投票构建的。但是,如果我要继续并且有人可以投票支持多达 100 件事情,那么查询将变得非常庞大。此时我正在使用此查询来获取列表中的下一项:

//$finarr is the received unserialized list of values from the database

$sql = "SELECT * FROM vote_item_headers WHERE Id NOT IN (".$finarr.") ORDER BY LastVoted DESC LIMIT 1"

//execute query and display results

我还应该注意到,在这一点上,我什至没有费心添加上面的第三个要求,因为坦率地说,当我不得不进行需要包含所有要求的查询时,我什至不知道从哪里开始或任何事情多于。

您可能会发现更多相关信息:我还有一些其他表格,如下所述。

core_users = 用户及其兴趣列表 core_interests = 所有兴趣列表 core_language = 项目可能属于的不同可能语言的列表 vote_item_headers = 所有可投票项目的列表,其中包含兴趣和语言表中的引用来定义可投票项目的额外属性。core_votes =人们投票的主列表

如果这对你们来说太模糊了,我真的很抱歉,我真正想要的只是在这种情况下处理大量需要组合以获得结果的信息时的指导。

欢迎任何建议。我很高兴重组整个事情只是为了让它正确。

4

1 回答 1

0

voted

user_id   | Id
----------+------
    1     | 12
    1     | 14
    1     | 187
    2     | 23

SELECT * FROM vote_item_headers 
    WHERE Id NOT IN (
        SELECT Id FROM voted WHERE user_id=1234
    ) 
    ORDER BY LastVoted DESC LIMIT 1

但你也想要相关的帖子

relevant_posts

user_id   | Id
----------+------
    1     | 342
    1     | 253
    1     | 32
    2     | 53

SELECT vote_item_headers.* FROM vote_item_headers 
    # cut down the amount returned with relevant_posts table
    INNER JOIN relevant_posts ON (
        vote_item_headers.Id=relevant_posts.Id
        AND user_id=1234
    ) 
    WHERE vote_item_headers.Id NOT IN (
        SELECT Id FROM voted WHERE user_id=1234
    ) 
    ORDER BY LastVoted DESC LIMIT 1
于 2012-12-10T18:05:36.037 回答