没有得到正确的上下票数

umuewwlo  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(374)

我的sql语句有问题。我有一个jqueryupvote插件,它在我的数据库中保存真值和假值。如果用户按upvote,则在upvote volume中保存true;如果用户按down vote,则在down vote列中保存true;如果用户按downvote,则在already upvote topic中保存true;如果用户按downvote,则在upvote列中保存false。我知道这有点混乱。此外,对新主题进行投票将导致在您单击的另一列中保存0。问题是

Fig 1: when clicked up  |Fig 2: when clicked down


但当我刷新页面时,数字仍然是0
我的sql查询:

SELECT
SUM(
    IF(Upvote='true' AND Downvote='false',1,
        IF(upvote='false' AND Downvote='true',-1,
            IF(Upvote='false' AND Downvote='false',-1,
                IF(Downvote='false',1,
                    IF(Downvote='true' AND (Upvote='0' OR Upvote=false),-1,0)
                )
            )
        )
    )) as `votes`

从topicd=:电流的额定值

njthzxwz

njthzxwz1#

为了正确记录选票,你需要3条信息,
投票的主题是什么。
投票的人。
如果投票结果是赞成还是反对
这需要多对多关系。许多用户可以对许多主题进行投票。这样说很有帮助,看看有没有道理。
例如,我们不能说,许多用户可以就一个主题投票。因为我想你会有更多的主题。我们不能说很多主题都是由一个用户投票决定的。这两个都没有什么意义。
多对多关系需要3张表。你有这个

users
   id
 //and other stuff

topics
   id
 //and other stuff

votes 
   user_id
   topic_id
   value (1 or -1)
 //and other stuff, you could put the time for example

然后你可以简单地计算一个主题

SELECT
  sum(value)
FROM
  votes
WHERE
 topic_id = 1

然后你就可以简单的翻转 value 或删除0的记录。
您可以判断用户是否对某个问题进行了投票,以及如何投票

SELECT
   value
FROM
   votes
WHERE
   topic_id = 1 --current topic
 AND
   user_id = 20 --current user

对于您将获得的用户 no record 或者 -1 或者 1 . 那么设置按钮的状态就很简单了。
你不能强迫数据进入一个不合适的模型。数据决定了它需要的关系。当你找到一个合适的你知道,因为每件事都变得琐碎。
最后一件事你应该 votes 打开组合唯一键 user_id 以及 topic_id . 这样,用户就不能在同一主题上投2倍的票

topic_id, user_id
   1       1   //ok
   1       2   //ok
   2       1   //ok
//   1       1 - this violates the unique constraint

如果您不知道如何做到这一点,请在phpmyadmin的“结构”选项卡中,选中每个字段旁边的复选框,然后在下面的一些按钮中单击“唯一”(不是那一排,而是下面那一排)。它甚至可以是主键,但是有一个单独的代理键(auto increment id)的参数

相关问题