如何在mysql中使用SUM和GROUP By更新另一个查询中包含的记录

时间:2014-09-16 17:29:10

标签: php mysql

我有一个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 upvote down发布帖子即内容,每次投票与评级相同时都会插入记录,表格中会加上其他数据,例如ip,{{ 1}} id

现在我正在尝试在php中创建cronjob脚本contentSUM(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中进行总结,然后更新每条记录。

1 个答案:

答案 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)

如果你想重复使用连接来再次做同样的事情,你需要在再次创建临时表之前删除临时表,但是如果你只是想在页面中一次执行它,它会自动消失当数据库在页面末尾断开连接时。