天天看点

一条sql揭秘你最亲密的微信好友

qq空间有个栏目叫谁最在乎你和你最在乎谁,大概是通过你和好友间的互动来推断的,微信的聊天记录数据应该更能推断出更多的可能来,今天我们用一条sql来分析出谁是你最亲密的好友。

首先对微信两个主要的数据表来个大胆的猜测,一个用户user表,一个聊天记录msg表,user用户表用来存放微信用户信息,每个用户都会以一条记录的形式存在该表中,msg表用来存放用户之间的聊天信息,其中用户间的每一条消息也都会以一条记录的形式存在msg表中,两个表结构假设如下图所示。

一条sql揭秘你最亲密的微信好友

接下来我们要通过聊天记录来分析出谁是给你发消息最多的人,从而推断出TA是你最亲密的人。在这里我们打算用一条sql语句来找出这个你最亲密的人,先来看下这条sql语句长啥样吧。

SELECT count(*) as nums,`user`.`name` FROM msg LEFT JOIN `user` ON msg.from_uid = `user`.uid WHERE to_uid=2 GROUP BY from_uid HAVING COUNT(*) >= 1 ORDER BY COUNT(*) DESC
           

左右滑动查看完整sql语句

这条sql主要用到了两个很关键的方法,group by 和 having,其中group by是分组的意思,having是对分组后的结果集再做一次条件筛选,我们来详细解释下这条sql语句。首先是从msg聊天记录表中以发消息者id作为分组依据,即每个消息发送者id都会被分成一个组,使用count(*)来统计每个组发送消息的总条数,再结合where条件筛选出消息是发送给我的记录数,这样一来就可以筛选出每个好友给我发消息的总条数了,我们暂且把这个结果集称作结果集A,接下来我们要继续在结果集A中筛选出消息条数大于2的好友列表,并且将这个列表倒序排序,即得到一个谁最在乎我的一个列表,这也就是我们最终要得到的一个结果集暂且也称作结果集B。要从结果集A中再筛选出结果集B,在mysql中我们需要使用having来做二次筛选,结果集A其实是通过where来筛选的,where和having的区别可以理解为一前一后,where是对数据聚合前的筛选,having是对通过where条件筛选出的结果集进行二次筛选。下面我们列出筛选出结果集A对应的sql语句。

SELECT count(*) as nums,from_uid FROM msg WHERE to_uid=2 GROUP BY from_uid ORDER BY count(*) DESC
           

结果集A——左右滑动查看完整sql语句

上面说的这些并不是真的是在对微信数据库的猜测,仅仅是为了举一个大家都熟悉的例子来熟悉mysql中group by 和having的使用,同时也可以说明我们生活中常用的互联网产品的程序实现思路。

最后要告诉大家的是谭某人最亲密的微信好友是小马哥,有图作证。

一条sql揭秘你最亲密的微信好友
一条sql揭秘你最亲密的微信好友
一条sql揭秘你最亲密的微信好友
一条sql揭秘你最亲密的微信好友

继续阅读