无法弄清楚“一旦10个用户喜欢它就批准帖子”的系统

Posted

技术标签:

【中文标题】无法弄清楚“一旦10个用户喜欢它就批准帖子”的系统【英文标题】:Can't figure out the system for "approve post once 10 users like it" 【发布时间】:2011-12-21 21:44:46 【问题描述】:

我有一个文章投票系统。文章存储在“故事”表中,所有投票都存储在“投票”表中。 'stories' 表中的 id 等于 'votes' 表中的 item_name(因此每个投票都与 item_name 的文章相关)。

我想这样当投票总和达到 10 时,它会将“故事”表中的“显示”字段更新为“1”的值。

这是我现在用来将投票插入数据库的查询(我正在考虑向其中添加一些内容或创建另一个查询来汇总文章用户正在投票的 vote_values 并查看它们是否 > 10 如果是设置显示 = 1 ) :

$q = "INSERT INTO $this->votes_table (`vote_value`, `item_name`, `ip`) VALUES($dir, '$story_id', '$ip')";

这是我的数据库结构:

故事表


投票表

【问题讨论】:

这里的触发器可能是一个很好的例子...... 嗨,对不起,我是 php 新手,什么是触发器? 不要在 item_name [varhcar(255)] 中存储 id [int(11)],而是在投票中创建一个名为 story_id [int(11)] 的外键,并使用为此修改的 piotrekr 的 SQL 语句改变。 触发器是执行某个事件时发生的数据库逻辑。因此,当在 Votes 表上发生插入时,当计数 >= 10 时,您可以触发一些逻辑来更新 Stories.showing 列。当业务逻辑(如您的情况)指示代码应该存在时,我喜欢避免触发器域。 我不是在谈论任何与 PHP 相关的东西,我在谈论mysql triggers,它是在某些事件发生时执行的一系列 SQL 语句。因此,您将创建一个触发器,该触发器在每次将行插入votes 表时发生,该触发器执行选择以查看是否有 >= 10 票,如果有,则更新stories 表。基本上我要说的是让 MySQL 为你做这件事,这样你就可以保持你的 PHP 整洁,而不必担心额外的查询。 【参考方案1】:

试试:

CREATE TEMPORARY TABLE tmp_ids SELECT s.id
FROM stories s 
JOIN votes v ON v.item_name = s.id 
WHERE s.showing != 1
GROUP BY s.id 
HAVING SUM(v.vote_value) >= 10;

UPDATE stories SET showing = 1 WHERE id IN (SELECT id FROM tmp_ids)

// 每次投票的编辑版本

UPDATE stories s 
SET s.showing = IF((SELECT SUM(vote_value) FROM votes WHERE item_name = ?) >= 10, 1, 0)
WHERE s.id = ?

【讨论】:

好吧,这样我可以选择投票值>=10的文章,但是如何设置showing=1? 我已经添加了 where 条件不选择作为已经显示的故事的总票数 = 1 所以当投票时,执行上面的SQL。当结果 >= 10 时,将已投票项目的 showing 列的 Stories 表更新为 1。如果故事已经显示您确实需要执行上述 SQL,除非您还允许投票(在这种情况下,您'每次都需要执行它来捕捉边缘情况)。 ... 修改后的 SQL 代码如果每次有人投票时都执行,将不会横向扩展。随着故事和投票数量的增加,进行投票所需的时间也会增加。 不,它更像是 cron 作业 sql。如果你想更新每张投票的显示,你可以UPDATE stories s SET s.showing = 1 WHERE s.id = ? AND (SELECT SUM(vote_value) FROM votes WHERE item_name = s.id) >= 10

以上是关于无法弄清楚“一旦10个用户喜欢它就批准帖子”的系统的主要内容,如果未能解决你的问题,请参考以下文章

无法弄清楚为啥“悬停”不起作用

无法弄清楚为啥触发器无效?

似乎无法弄清楚 ExpandableListAdapter

无法弄清楚为啥我的注销按钮不起作用(php)[重复]

我无法弄清楚我的简单 Java 作业

无法弄清楚如何修复错误