mysql过滤两个不同字段的sql语句
众所周知,一般在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。当然这也不是问题,数据我们已经查到了,我们可以通过程序再对结果进行一次合并,我们就可以获得我们希望获得的数据。
在最近联系比较少的情况下,上述的处理方法并没有什么不合适的地方,但是当最近联系人较多时,我们可能会想到使用分页对列表页进行分页。但是上述的做法很明显就已经达不到我们的预期了,我们希望将其整合到一条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+Mysql实现多关键字与多字段生成SQL语句的函数
-
MySQL根据某一个或者多个字段查找重复数据的sql语句
-
SQL语句解决:根据一张表中的两个字段拿另外一张表中的同一个字段的查询
-
sql查询语句把两个字段的值在一起显示
-
只有两个字段用一个sql语句查询出某个学生的姓名、成绩以及在表中的排名
-
MySQL常用的建表、添加字段、修改字段、添加索引SQL语句写法总结
-
mysql 查询 两个表中不同字段的 和,并通过两个表的时间来分组
-
Mysql 根据一个表数据更新另一个表的某些字段(sql语句)
-
sql截取字段最后以特定字符隔开的内容语句_MySQL
-
MySql获取某个字段存在于哪个表的sql语句_MySQL