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的使用,同時也可以說明我們生活中常用的網際網路産品的程式實作思路。
最後要告訴大家的是譚某人最親密的微信好友是小馬哥,有圖作證。