文档章节

仿QQ消息列表页SQL

qii
 qii
发布于 2016/07/04 15:43
字数 585
阅读 247
收藏 0

要做一个聊天功能,其中,有个列表页,跟QQ消息的一样。

先看表结构(MySQL):

message_id	int		短消息索引id
message_parent_id	int		回复短消息message_id	
from_member_id	int		短消息发送人		
to_member_id	varchar	短消息接收人	
message_title	varchar	短消息标题
message_body	varchar	短消息内容
message_open	tinyint	短消息打开状态	
message_state	tinyint	短消息状态,0为正常状态,1为发送人删除状态,2为接收人删除状态
from_member_name	varchar	发信息人用户名	
to_member_name	varchar	接收人用户名

先看需求:(箭头方向代表消息的发送方向)

消息列表  ==>  最后查询显示的消息
a->b  ==> a->b
a->b,b->a ==> b->a
a->b,b->a,a->c ==> b->a,a->c
a->b,b->a,a->c,c->a ==> b->a,c->a

第一个想法:a发出的消息+a收到的消息-重复的消息

问题:a发出去的消息,不一定是最后的消息,并且,不好排除重复的消息。

第二个想法:a接收的或者发出去的消息,按照对方来分组,并去最后一条消息

问题:对方可能是发出者或者接收者,group by不能实现。

第三个想法:在第二个想法的基础上,实现一个2人之间唯一的字段,用来分组。取用户id,组成字段,ab,ac,这样,就可以实现分组,后面的问题就解决了。

如果按照from to来组合,那么可能出现的组合就有2种,ab,ba,这两种是等价的。但对于group by来说,则是两种组合。

这里需要创造一个唯一的组合:

CASE WHEN m1.from_member_id = 1 THEN CONCAT( m1.from_member_id, m1.to_member_id ) ELSE CONCAT( m1.to_member_id, m1.from_member_id ) END id

这里1为当前用户的id。

完整SQL如下:

SELECT
	m2.*, CASE
WHEN m2.from_member_id = 1 THEN
	m2.to_member_name
ELSE
	m2.from_member_name
END show_name,
(
	SELECT
		member_avatar
	FROM
		az_member m3
	WHERE
		m3.member_id = (
			CASE
			WHEN m2.to_member_id = 1 THEN
				m2.from_member_id
			ELSE
				m2.to_member_id
			END
		)
) member_avatar
FROM
	az_message m2
WHERE
	m2.message_id IN (
		SELECT
			max(zt.message_id)
		FROM
			(
				SELECT
					m1.*, CASE
				WHEN m1.from_member_id = 1 THEN
					CONCAT(
						m1.from_member_id,
						m1.to_member_id
					)
				ELSE
					CONCAT(
						m1.to_member_id,
						m1.from_member_id
					)
				END id
				FROM
					az_message m1
				WHERE
					(
						m1.from_member_id = 1
						OR m1.to_member_id = 1
					)
				AND m1.message_type = 5
				AND m1.message_open = 0
			) zt
		GROUP BY
			id
	)

过程总结:

1.创造一个唯一的字段。

2.按照唯一字段分组,并取最大id

3.取最大id所在行记录

© 著作权归作者所有

共有 人打赏支持
上一篇: 大鱼海棠
下一篇: mysql 无法启动
qii

qii

粉丝 13
博文 77
码字总数 23520
作品 0
昆明
高级程序员
私信 提问
Android UI 特效大全

Android UI特效大全 总体传送门:http://git.oschina.net/bob4j/Android-UI 基本上项目中都有效果图可自行查看 , 并且有些项目中都有README.md 文件,使用前请先阅读以下。 1.弧形(圆形)菜单...

不正经啊不正经
2015/07/31
0
0
【开源项目】 超仿微信6.0源码开源,学习和二次开发的利器

先上干货,项目的体验安装包地址: http://www.imgeek.org/data/download/Fanxin.apk 整个项目的源码包将近40M(素材太杂,未清理)太大上传不了,源码可点击此处下载:http://www.imgeek.o...

午夜狂魔
2015/03/28
4.4K
2
Wex5 3.3版本仿淘宝开发视频

第一讲 仿淘宝概述 第二讲 创建应用和首页开发 第三讲 分类页和列表页 第四讲 商品详细页和微信分享 第五讲 购物车页和搜索页 视频下载地址:http://wex5.com/cn/downloads/ QQ交流群:30057...

muyu
2016/01/16
1K
0
手机直播可二次开发、萌颜、连麦、弹幕,首选云豹直播

云豹直播(0538-8270220)作为业内领先的直播程序开发商,全面分析市场趋势,强势推出最符合市场需求的直播营销方案----云豹直播系统。 云豹直播是国内第一家专业开发视频直播程序软件以及出...

泰安云豹直播
2016/07/18
0
0
凡信 2.0 beta 发布-超仿微信的开源项目

凡信的第一个版本于2015年4月份发布,之后由于自己工作忙碌的原因,一直没有重大的更新内容。2016年1月份抽空做了一些更新。主要是加入了朋友圈和钱包这两块内容,以及对第一版的一些bug的修...

程开源
2016/02/16
8K
15

没有更多内容

加载失败,请刷新页面

加载更多

Spring源码学习笔记-1-Resource

打算补下基础,学习下Spring源码,参考书籍是《Spring源码深度解析》,使用版本是Spring 3.2.x,本来想试图用脑图记录的,发现代码部分不好贴,还是作罢,这里只大略记录下想法,不写太细了 ...

zypy333
今天
10
0
RestClientUtil和ConfigRestClientUtil区别说明

RestClientUtil directly executes the DSL defined in the code. ConfigRestClientUtil gets the DSL defined in the configuration file by the DSL name and executes it. RestClientUtil......

bboss
今天
16
0

中国龙-扬科
昨天
2
0
Linux系统设置全局的默认网络代理

更改全局配置文件/etc/profile all_proxy="all_proxy=socks://rahowviahva.ml:80/"ftp_proxy="ftp_proxy=http://rahowviahva.ml:80/"http_proxy="http_proxy=http://rahowviahva.ml:80/"......

临江仙卜算子
昨天
10
0
java框架学习日志-6(bean作用域和自动装配)

本章补充bean的作用域和自动装配 bean作用域 之前提到可以用scope来设置单例模式 <bean id="type" class="cn.dota2.tpye.Type" scope="singleton"></bean> 除此之外还有几种用法 singleton:......

白话
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部