1. 程式人生 > >一條sql揭祕你最親密的微信好友

一條sql揭祕你最親密的微信好友

qq空間有個欄目叫誰最在乎你和你最在乎誰,大概是通過你和好友間的互動來推斷的,微信的聊天記錄資料應該更能推斷出更多的可能來,今天我們用一條sql來分析出誰是你最親密的好友。

 

 

首先對微信兩個主要的資料表來個大膽的猜測,一個使用者user表,一個聊天記錄msg表,user使用者表用來存放微信使用者資訊,每個使用者都會以一條記錄的形式存在該表中,msg表用來存放使用者之間的聊天資訊,其中使用者間的每一條訊息也都會以一條記錄的形式存在msg表中,兩個表結構假設如下圖所示。

 

 

接下來我們要通過聊天記錄來分析出誰是給你發訊息最多的人,從而推斷出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的使用,同時也可以說明我們生活中常用的網際網路產品的程式實現思路。

 

最後要告訴大家的是譚某人最親密的微信好友是小馬哥,有圖作證。