昨天遇到一个问题,视频浏览历史记录,数据因需要客服统计视频播放量、播放时长以及各分类的喜好度所以播放信息要尽量的完整,但客户看到的历史又不能重复,且展示的是最后一次播放的时长以便继续观看。
数据展示如下:
进行正常的排序分组执行sql语句:
select vpl.user_id, vc.cat_name, v.id as videoId, v.video_name as videoName ,vpl.create_time, vpl.play_times from zg_video_playlog vpl left join zg_video v on vpl.video_id=v.id left join zg_video_cat vc on vc.id=v.cat_id group by vpl.video_id ORDER BY vpl.id desc
结果如下:
注意:
按数据展示来看,最后一次访问的数据应为id=12的数据在第一位,且播放时间应为03-21日,明显这不是我想要的数据
根据上面的分析,group by到select时只取到分组里的第一条信息。解决方案如下:
第一步:max()
根据结果来看,我们已经拿到了最新观看的顺序,但还是有问题观看的时间还不是3-20,如果我们只要保证顺序用这个方法是完全没问题的。
第二步:
先排序,然后group,这样的话自然可以取到最适合的一条数据可以试试
select vpl.id as vplId, v.id as videoId, v.thumb, v.video_name, v.video_url, vpl.user_id, vpl.create_time , vpl.play_times as playTimes , v.look_front, v.summary from (select * from zg_video_playlog vpl where vpl.user_id=521 order by vpl.id desc) `vpl` left join zg_video v on vpl.video_id=v.id left join zg_video_cat vc on vc.id=v.cat_id group by vpl.video_id order by vpl.id desc
达到效果!
相关推荐
在MySQL中,有时候我们需要从一个表中为每个用户获取一条记录,这通常涉及到对数据进行分组并选择每个组中的特定记录。以下是对三种不同方法的详细解释,这些方法可以帮助你在MySQL中实现这一目标。 **1. 先排序后...
在MySQL数据库管理中,有时我们需要清理表中的重复数据,但同时希望保留每个唯一标识符(如`peopleName`)下的最小`peopleId`。这里提到的解决方案是通过使用子查询来实现这一目标,但该过程可能会遇到一些挑战。...
在MySQL中的goods例子中,`SELECT gperson, COUNT(*) FROM goods GROUP BY gperson`会返回每个gperson及其对应的商品数量。 2. **状态字段**: 设置一个State字段来标记数据的状态,如State=1表示有效,State=0...
为了去除重复项,我们可以创建一个新的临时表`tmp`,并使用`GROUP BY`语句来根据`no`字段进行分组,这样每个`no`值只会出现一次: ```sql create table tmp select id,no from pep group by no; ``` 但在此过程中...
此外,`mysqldump`还提供了许多其他选项,如`--add-locks`在每个表导出前锁定表,`--add-drop-table`在每个`CREATE TABLE`语句前添加`DROP TABLE`,`--compress`在客户端和服务器之间压缩数据,以及`--delayed`使用`...
在MySQL中,对于`VARCHAR`类型,索引存储不仅包括实际字符,还包括每个字符的长度字节(1到2字节,取决于字符集)。因此,即使`client_id`仅存储5-15个字节,索引也会占用比实际数据更多的空间。在本例中,如果`...
`NOT NULL`表示该字段不允许为空,`PRIMARY KEY`定义了主键,用于唯一标识每条记录。 2. 修改表: 修改表结构包括添加新字段、改变主键等。 ```sql ALTER TABLE table_name ADD COLUMN column_name datatype; ...
在MySQL中,处理时间日期的函数非常丰富,其中`DATE_FORMAT(date, format)`是一个常用的函数,用于按照指定的格式展示日期和时间。以下是一些常用的格式化参数: - `%a`:缩写星期名 - `%b`:缩写月名 - `%c`:月,...
- **聚合函数视图**:视图的查询结果是聚合函数计算的结果,例如,统计每个组的学生人数: ```sql CREATE VIEW view_student_count AS SELECT t_group.NAME, COUNT(*) AS student_num FROM t_student JOIN t_...
4. TaskService: 在Activiti中业务流程定义中的每一个执行节点被称为一个Task,对流程中的数据存取,状态变更等操作均需要在Task中完成。TaskService提供了对用户Task 和Form相关的操作。它提供了运行时任务查询、...
- 避免大表join,使用group by分组,禁止order by rand(),单条语句不宜同时更新多个表。 7. **权限与安全** - 应用权限以查、增、改为主,删除操作由DBA评估授予,禁止授予super权限。 - 所有DDL操作通过特定...
每个实例都是经过笔者精心筛选的,具有很强的实用性,其中一些实例是开发人员难于寻觅的解决方案。 本书两卷共计1200个例子,包括了开发中各个方面最常用的实例,是目前市场上实例最全面的开发类图书;本书实例来源...
2. 查询语句:`SELECT m.id, m.title, m.hits, COUNT(c.comment_id) as replies FROM message m LEFT JOIN comment c ON m.id = c.id GROUP BY m.id ORDER BY replies DESC`. 3. 下拉菜单实现:使用PHP遍历`category...