如何在sql关系中添加批量(基于查询导致另一种关系)?

时间:2017-10-27 06:22:45

标签: mysql sql

我如何在sql(取自glassdoor)中执行此问题:

你有一张表,你有date,user_id,song_id和count。它在每天结束时显示她的历史记录中有多少次用户收听了某首歌曲。所以计数是累积总和。 您必须每天更新此信息,这是基于第二个表格,该表格会在用户收听某首歌曲时实时记录。基本上,在每天结束时,您转到第二个表并拉出每个用户/歌曲组合的计数,然后将此计数添加到具有生命周期计数的第一个表中。

我特别不知道如何以这种批量/大规模/循环类型的方式更新表,并且会欣赏mysql代码来实现类似的东西。我没有编写代码,因为我不知道如何以有效的方式进行如此大规模的添加。

1 个答案:

答案 0 :(得分:1)

听起来你没有在现有的计数中添加任何内容,你在当天插入了一个新的记录,其总播放次数与当天相同。历史记录表中的旧记录未更新

每天结束时,你都会运行:

INSERT INTO playhistory
SELECT CURDATE(), user_id, song_id, count(*)
FROM individualplays
GROUP BY user_id, song_id

Individualplays表始终保存用户和歌曲ID。如果新用户今天播放相同的歌曲10次,则计数(*)将为10.明天,如果她再播放该歌曲5次,则计数现在为15

如果您无法保证在一天结束时立即运行查询,则您的个人手表需要播放歌曲的日期和时间,然后在第二天的任何时间,您可以更新您的历史记录表:< / p>

INSERT INTO playhistory
SELECT DATE_SUB(CURDATE(), INTERVAL 1 DAY), user_id, song_id, count(*)
FROM individualplays
WHERE playdate < CURDATE()
GROUP BY user_id, song_id
实际上,你很遗憾地使用MySQL,因为更强大的rdbms可以通过使用分析/窗口函数动态地完成个人播放表中的历史记录。可以执行诸如计算从开始时间到当前行,每个用户/歌曲的所有行的设备。你可以在MySQL中模拟它们,但它非常讨厌 - 它基本上会涉及在userid = userid,songid = songid和playdate上将个人游戏表连接到自身