我有一个mysql表
content_votes_tmp
+------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------------+------+-----+---------+----------------+
| up | int(11) | NO | MUL | 0 | |
| down | int(11) | NO | | 0 | |
| ip | int(10) unsigned | NO | | NULL | |
| content | int(11) | NO | | NULL | |
| datetime | datetime | NO | | NULL | |
| is_updated | tinyint(2) | NO | | 0 | |
| record_num | int(11) | NO | PRI | NULL | auto_increment |
+------------+------------------+------+-----+---------+----------------+
冲浪者可以vote up
或vote down
发布帖子即内容,每次投票与评级相同时都会插入记录,表格中会加上其他数据,例如ip
,{{ 1}} id
现在我正在尝试在php中创建cronjob脚本content
和SUM(up)
投票
SUM(down)
然后在php中使用while循环我可以更新特定mysqli_query($con, "SELECT SUM(up) as up_count, SUM(down) as down_count, content FROM `content_votes_tmp` WHERE is_updated = 0 GROUP by content")
id的主表,
但是我想将content
的一部分记录设置为更新,即SUM
,因此相同的值不会一次又一次地加总。
我怎样才能实现这个?使用mysql查询?并且在相同的数据集上工作,每隔一秒/几毫秒将记录插入表中。
我能想到实现这一目标的另一种方法是获取所有未更新的记录并在php中进行总结,然后更新每条记录。
答案 0 :(得分:1)
最简单的方法可能是临时表。使用您要选择的record_num
值创建一个;
CREATE TEMPORARY TABLE temp_table AS
SELECT record_num FROM `content_votes_tmp` WHERE is_updated = 0;
然后使用临时表进行计算;
SELECT SUM(up) as up_count, SUM(down) as down_count, content
FROM `content_votes_tmp`
WHERE record_num IN (SELECT record_num FROM temp_table)
GROUP by content
收到结果后,您可以对刚刚计算出的值设置is_updated;
UPDATE `content_votes_tmp`
SET is_updated = 1
WHERE record_num IN (SELECT record_num FROM temp_table)
如果你想重复使用连接来再次做同样的事情,你需要在再次创建临时表之前删除临时表,但是如果你只是想在页面中一次执行它,它会自动消失当数据库在页面末尾断开连接时。