0

0

mysql过滤两个不同字段的sql语句

php中文网

php中文网

发布时间:2016-06-07 15:53:08

|

1514人浏览过

|

来源于php中文网

原创

众所周知,一般在mysql过滤相同记录时常用的关键字是distinct, group by等关键字,但是怎么过滤两个不同的字段相同的记录呢。 以下是问题需求: 有一张表chat_history中存在字段id,from_uid,to_uid等字段,其中id为自增id,from_uid为消息的发送方的uid,to_


众所周知,一般在mysql过滤相同记录时常用的关键字是distinct, group by等关键字,但是怎么过滤两个不同的字段相同的记录呢。


以下是问题需求:

有一张表chat_history中存在字段id,from_uid,to_uid等字段,其中id为自增id,from_uid为消息的发送方的uid,to_uid为接收方的uid,现在需要获得某一个uid的最新联系人。


首先的第一个想法就是对from_uid,to_uid进行group by操作然后获得max(id)过滤出from_uid或者to_uid等于目标uid的值。

按照这种想法我们可以获得如下的sql语句


select max(id) as mid,from_uid,to_uid from chat_history where from_uid="xxxxxx" or to_uid = "xxxxxx" group by from_uid, to_uid order by mid.

这时我们查看结果可以很明显的发现一个问题,假设两个相互通信的uid1和uid2,我们通过上面的sql语句获取到两条数据from_uid=uid1,to_uid=uid2和from_uid=uid2,to_uid=uid1。当然这也不是问题,数据我们已经查到了,我们可以通过程序再对结果进行一次合并,我们就可以获得我们希望获得的数据。

Petalica Paint
Petalica Paint

用AI为你的画自动上色!

下载


在最近联系比较少的情况下,上述的处理方法并没有什么不合适的地方,但是当最近联系人较多时,我们可能会想到使用分页对列表页进行分页。但是上述的做法很明显就已经达不到我们的预期了,我们希望将其整合到一条sql语句中,并且可以使用limit关键字。


通过观察,我们希望过滤诸如from_uid=uid1,to_uid=uid2和from_uid=uid2,to_uid=uid1这样的记录,第一反应就是我们可以在上述的sql语句作为临时表,再在外层加sql语句进行处理,当然这种方法从逻辑上是成立的,但是他是以牺牲效率来实现的,博主个人是比较反感使用中间表的。


通过对上述结果的观察,我们可以获得这样一种信息,uid1,uid2是不是可以作为一个字段进行处理呢,在mysql中存在关键子concat这是对两个字段进行合并操作,但是简单的concat(from_uid,to_uid)还是达不到我们希望的结果,但是mysql提供了逻辑运算,case 操作。


可以将以上sql语句更改如下:

SELECT max( id ) AS mid, from_uid, to_uid, 
        CASE to_uid
        WHEN 'xxx'
	THEN concat( to_uid, from_uid )
	ELSE concat( from_uid, to_uid )
	END AS to_from_uid
FROM chat_history
WHERE to_uid = 'xxx' OR from_uid = 'xxx'
GROUP BY to_from_uid
ORDER BY mid DESC
LIMIT 0,20


相关专题

更多
php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

5

2026.01.13

PHP缓存策略教程大全
PHP缓存策略教程大全

本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

1

2026.01.13

交互式图表和动态图表教程汇总
交互式图表和动态图表教程汇总

本专题整合了交互式图表和动态图表的相关内容,阅读专题下面的文章了解更多详细内容。

15

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

4

2026.01.13

nginx部署php项目教程汇总
nginx部署php项目教程汇总

本专题整合了nginx部署php项目教程汇总,阅读专题下面的文章了解更多详细内容。

5

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.7万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 787人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号