MySQL連表查詢分組去重的實(shí)現(xiàn)示例
業(yè)務(wù)邏輯
通過(guò)多種渠道將小程序的活動(dòng)頁(yè)鏈接發(fā)布出去,比如通過(guò)多多種短信附帶鏈接( channel 就記為 sms1,sms2,sms3 ),或者海報(bào)上面貼微信小程序的二維碼( channel 記為 qrcode1,qrcode2,qrcode3 ),線下會(huì)員通過(guò)掃描二維碼也能進(jìn)入小程序指定的活動(dòng)頁(yè),亦或者是通過(guò)其他會(huì)員分享的小程序鏈接也可以進(jìn)入小程序( channel 記為 share)。這些不同的進(jìn)入方式在我這篇文章統(tǒng)稱為不同的渠道,也就是提到的 channel 字段。從不同的渠道進(jìn)入活動(dòng)頁(yè)就會(huì)產(chǎn)生一條頁(yè)面訪問(wèn)記錄。會(huì)被計(jì)入 page_view 這張表里。
會(huì)員進(jìn)入小程序的指定活動(dòng)頁(yè)后,在頁(yè)面上面觸發(fā)一系列操作后,會(huì)得到相應(yīng)的反饋,比如獲得積分,或者獲得優(yōu)惠券等等。這步操作稱為參與活動(dòng)。這條數(shù)據(jù)會(huì)被記入 activity_record 這張表里。
現(xiàn)在呢,運(yùn)營(yíng)小姐姐要求得到一份數(shù)據(jù)報(bào)表。每位參與活動(dòng)的會(huì)員是從什么時(shí)間,哪個(gè)渠道里面進(jìn)活動(dòng)的?
數(shù)據(jù)表結(jié)構(gòu)
| 表名 | member_id | participate_time |
|---|---|---|
| activity_record | 會(huì)員號(hào) | 活動(dòng)參與時(shí)間 |
| 表名 | member_id | channel | view_time |
|---|---|---|---|
| page_view | 會(huì)員號(hào) | 渠道 | 頁(yè)面訪問(wèn)時(shí)間 |
查詢邏輯
因?yàn)槊课粫?huì)員只能參加一次活動(dòng),也就是活動(dòng)期間只能獲得過(guò)一次積分,或者領(lǐng)取過(guò)一次優(yōu)惠券等等這種意思,也就是每位會(huì)員最多只會(huì)產(chǎn)生一條 activity_record 記錄。
可是 page_view 這張表的記錄方式就不一樣了。會(huì)員可能既收到過(guò)短信鏈接,又掃描過(guò)活動(dòng)二維碼,又被好友分享過(guò)活動(dòng)鏈接,這下,對(duì)于這位會(huì)員來(lái)說(shuō),就會(huì)產(chǎn)生多條頁(yè)面訪問(wèn)記錄,即在 page_view 里產(chǎn)生多條數(shù)據(jù)。
你想想,會(huì)員肯定是先通過(guò)某一個(gè)渠道進(jìn)入到活動(dòng)頁(yè)面,才能去參加活動(dòng)。也就是有多條 page_view 的數(shù)據(jù),按照 view_time 倒序排列,總有一條的 view_time 是小于且最接近于 activity_record 的 participate_time,下一條 page_view 的 view_time 就會(huì)大于 activity_record 的 participate_time。
SQL腳本
select c.member_id,c.view_time,.channel from (
SELECT
member_id,
SUBSTRING_INDEX( GROUP_CONCAT( view_time ORDER BY view_time DESC ), ',', 1 ) AS view_time,
SUBSTRING_INDEX( GROUP_CONCAT( channel ORDER BY channel DESC ), ',', 1 ) AS channel
FROM
page_view a LEFT JOIN activity_record b
on a.member_id = b.member_id
where a.view_time < b.participate_time
GROUP BY
member_id) c;
腳本說(shuō)明
- GROUP_CONCAT:通過(guò)使用distinct可以排除重復(fù)值; group_concat( [distinct] 要連接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )
- SUBSTRING_INDEX:字符串截取函數(shù)。substring_index(str,delim,count)。str:要處理的字符串;delim:分隔符;count:計(jì)數(shù)
到此這篇關(guān)于MySQL連表查詢分組去重的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)MySQL連表查詢分組去重內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL中獲取最大值MAX()函數(shù)和ORDER BY … LIMIT 1比較
mysql取最大值的的是max 和order by兩種方式,同時(shí)也大多數(shù)人人為max的效率更高,在本文中,我們將介紹MySQL中MAX()和ORDER BY … LIMIT 1兩種獲取最大值的方法以及它們性能上的差異,同時(shí)我們將探討這種性能差異的原因,并提供一些優(yōu)化建議2024-03-03
使用pt-kill根據(jù)一定的規(guī)則來(lái)kill連接的方法
pt-kill 是一個(gè)優(yōu)秀的kill MySQL連接的一個(gè)工具,是percona toolkit的一部分,在因?yàn)榭臻e連接較多導(dǎo)致超過(guò)最大連接數(shù)、某個(gè)有問(wèn)題的sql導(dǎo)致mysql負(fù)載很高時(shí),都需要將一些連接kill掉,這個(gè)工具主要就是這個(gè)用途2016-04-04
MySQL實(shí)現(xiàn)兩張表數(shù)據(jù)的同步
本文將介紹mysql 觸發(fā)器實(shí)現(xiàn)兩個(gè)表的數(shù)據(jù)同步,需要學(xué)習(xí)MySQL的童鞋可以參考。2016-10-10
安裝Mysql5.7.10 winx64出現(xiàn)的幾個(gè)問(wèn)題匯總
這篇文章主要介紹了安裝Mysql5.7.10 winx64出現(xiàn)的幾個(gè)問(wèn)題匯總及解決方案,非常不錯(cuò),需要的朋友可以參考下2016-08-08
使用SQL實(shí)現(xiàn)小計(jì),合計(jì)以及排序
本篇文章是對(duì)SQL實(shí)現(xiàn)小計(jì),合計(jì)以及排序進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
解決mysql報(bào)錯(cuò)You must reset your password&nb
文章介紹了在Linux系統(tǒng)中解決MySQL 5.7及以上版本root用戶密碼過(guò)期無(wú)法登錄的問(wèn)題方法,以及如何處理系統(tǒng)權(quán)限表mysql.user結(jié)構(gòu)錯(cuò)誤的問(wèn)題2024-11-11

