我的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 =:当前
为了正确记录投票,您需要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或-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
Run Code Online (Sandbox Code Playgroud)
如果你不知道怎么做,在PHPmyAdmin中,在结构选项卡中,选中每个字段旁边的复选框,然后在下面有一些单独的按钮,只需单击它.(不是行中的那个,而是在那里).它甚至可以是主键,但是有一个单独的代理键(自动增量ID)的参数
| 归档时间: |
|
| 查看次数: |
78 次 |
| 最近记录: |