没有得到正确的向上和向下的数字

sac*_*jot 1 php mysql sql

我的SQL语句有问题.我有一个jQuery upvote插件,可以在我的数据库中保存true和false值.如果用户按下upvote,它将在upvote音量中保存为true,如果用户按下投票,它将在向下投票列中保存为true,如果用户按下已投票的主题,则将在downvote列中保存为true,在upvote列中保存为false.我知道这有点令人困惑.此外,对新主题进行投票将导致在您单击的相对列中保存0.问题是

在此输入图像描述 在此输入图像描述

Fig 1: when clicked up  |Fig 2: when clicked down
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

但是当我刷新页面时,数字仍为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`
Run Code Online (Sandbox Code Playgroud)

来自评级WHERE TopicD =:当前

Art*_*nix 6

为了正确记录投票,您需要3条信息,

  1. 投票的主题是什么.
  2. 谁做了投票.
  3. 如果投票上涨或下跌

这需要多对多的关系.许多用户可以对许多主题进行投票.它有点像这样说,看看它是否有意义.

例如,我们不能说,许多用户可以对一个主题进行投票.因为我假设你计划有一个以上的话题.我们不能说许多话题将由1位用户投票.这些都没有多大意义.

多对多的关系需要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
Run Code Online (Sandbox Code Playgroud)

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

SELECT
  sum(value)
FROM
  votes
WHERE
 topic_id = 1
Run Code Online (Sandbox Code Playgroud)

然后你只需value向上或向下翻转或删除0的记录.

您可以判断用户是否就某个问题进行了投票以及如何投票

SELECT
   value
FROM
   votes
WHERE
   topic_id = 1 --current topic
 AND
   user_id = 20 --current user
Run Code Online (Sandbox Code Playgroud)

对于您将获得no record-11.然后设置按钮的状态是微不足道的.

您无法将数据强制转换为不适合的模型.数据决定了它需要的关系.当你找到合适的人时,你知道因为一切都变得微不足道.

最后一件事你应该让它votes有一个组合的唯一键user_idtopic_id.这样,用户就不能对同一主题投票2次

topic_id, user_id
   1       1   //ok
   1       2   //ok
   2       1   //ok
//   1       1 - this violates the unique constraint
Run Code Online (Sandbox Code Playgroud)

如果你不知道怎么做,在PHPmyAdmin中,在结构选项卡中,选中每个字段旁边的复选框,然后在下面有一些单独的按钮,只需单击它.(不是行中的那个,而是在那里).它甚至可以是主键,但是有一个单独的代理键(自动增量ID)的参数