<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        關于一道mysql查詢面試題的思考解決過程

        來源:懂視網 責編:小采 時間:2020-11-09 06:54:08
        文檔

        關于一道mysql查詢面試題的思考解決過程

        關于一道mysql查詢面試題的思考解決過程:啰嗦(可跳過)前幾天面試,筆試時遇到這道題,讀了幾遍題目都是懵懵懂懂,一個段時間內至少N天,這N天中每天的分數總和要大于M,好繞,最后沒有寫對。今天想起來這道題,寫出了答案并進行了sql語句的驗證。推薦:《mysql視頻教程》問題某游戲使用mys
        推薦度:
        導讀關于一道mysql查詢面試題的思考解決過程:啰嗦(可跳過)前幾天面試,筆試時遇到這道題,讀了幾遍題目都是懵懵懂懂,一個段時間內至少N天,這N天中每天的分數總和要大于M,好繞,最后沒有寫對。今天想起來這道題,寫出了答案并進行了sql語句的驗證。推薦:《mysql視頻教程》問題某游戲使用mys
        啰嗦(可跳過)

        前幾天面試,筆試時遇到這道題,讀了幾遍題目都是懵懵懂懂,“一個段時間內至少N天,這N天中每天的分數總和要大于M”,好繞,最后沒有寫對。

        今天想起來這道題,寫出了答案并進行了sql語句的驗證。

        推薦:《mysql視頻教程》

        問題

        某游戲使用mysql數據庫,數據表 scores 記錄用戶得分歷史,uid 代表用戶ID, score 表示分數, date 表示日期,每個用戶每天都會產生多條記錄。

        數據結構以及數據行如下:

        1974c96bb77b1ec9df83a4a6e5cde56.png

        現在需要一份用戶列表,這些用戶在2017年3月份的31天中,至少要有16天,每天得分總和大于40分。使用一條sql語句表示。

        思路

        重新梳理需求,畫出重點。

        現在需要一份用戶列表,這些用戶在2017年3月份的31天中,至少要有16天,每天得分總和大于40分。使用一條sql語句表示。

        用戶列表

        代表一個不重復的 uid 列表,可使用 DISTINCT uid 或 GROUP BY uid 來實現。

        在2017年3月份的31天中

        使用 where 語句限定時間范圍。

        至少要有16天

        需要對天 date 進行聚合,使用聚合函數 COUNT(*) > 15來進行判斷。

        (每人)每天得分總和大于40

        需要對每天分數 score 分數進行聚合,使用聚合函數對 SUM(score) > 40來進行判斷。

        此處有2處聚合函數,但是是針對不同維度的(天和每天里的分數),所以需要使用子查詢,將2處聚合分別放置在內外層的sql語句上。

        由“從內到外”的原則,我們先對每天的得分進行聚合,那就是對天進行聚合。

        -- 在2017年3月份的31天中
        select * from scores where `date` >= '2017-03-01' and `date` <= '2017-03-31';
        -- (每人)每天得分總和大于40
        -- 使用 group by uid,date 實現對分數進行聚合,使用 having sum() 過濾結果
        select uid,date from scores where `date` >= '2017-03-01' and `date` <= '2017-03-31' group by uid, `date` having sum(score) > 40;
        -- 至少要有16天
        -- 以上條結果為基礎,在對 group by uid 實現對天進行聚合,使用 having count() 過濾結果
        select uid from (
         select uid,date from scores where `date` >= '2017-03-01' and `date` <= '2017-03-31' group by uid, `date` having sum(score) > 40
        ) group by uid having count(*) > 15;

        答案

        SELECT uid FROM (
         SELECT uid,date FROM WHERE `date` >= '2017-03-01' AND `date` <= '2017-03-31' GROUP BY uid,`date` HAVING SUM(score) > 40
        ) WHERE GROUP BY uid HAVING count(*) > 15;

        驗證

        -- 結構
        CREATE TABLE `scores` (
         `id` int(11) NOT NULL AUTO_INCREMENT,
         `uid` int(11) DEFAULT NULL,
         `score` int(11) DEFAULT NULL,
         `date` date DEFAULT NULL,
         PRIMARY KEY (`id`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
        -- 數據
        INSERT INTO `scores` VALUES ('1', '1', '1', '2018-04-03');
        INSERT INTO `scores` VALUES ('2', '1', '2', '2018-04-03');
        INSERT INTO `scores` VALUES ('3', '1', '1', '2018-04-04');
        INSERT INTO `scores` VALUES ('11', '1', '4', '2018-04-04');
        INSERT INTO `scores` VALUES ('12', '1', '3', '2018-04-06');
        INSERT INTO `scores` VALUES ('4', '1', '3', '2018-04-07');
        INSERT INTO `scores` VALUES ('5', '2', '2', '2018-04-04');
        INSERT INTO `scores` VALUES ('6', '2', '4', '2018-04-04');
        INSERT INTO `scores` VALUES ('7', '2', '1', '2018-04-03');
        INSERT INTO `scores` VALUES ('8', '3', '3', '2018-04-06');
        INSERT INTO `scores` VALUES ('9', '3', '1', '2018-04-05');
        INSERT INTO `scores` VALUES ('10', '3', '2', '2018-04-04');
        -- 因為數據錄入量有限,我們將結果改為修改改為:
        -- 獲取一個用戶列表,時間范圍是4號到6號,至少要有2天,每天分數總和大于2。
        -- 查詢
        -- 非最精簡語句,包含調試語句,可分段運行查看各個語句部分的效果。
        SELECT
         uid
        FROM
         (
         SELECT
         uid,
         `date`,
         sum(score) AS total_score
         FROM
         scores
         WHERE
         `date` > '2018-04-03'
         AND `date` < '2018-04-07'
         GROUP BY
         uid,
         `date`
         HAVING
         total_score > 2
         ORDER BY
         uid,
         date
         ) AS a
        GROUP BY
         uid
        HAVING
         count(*) > 1;
        -- 答案是:
        uid : 1

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        關于一道mysql查詢面試題的思考解決過程

        關于一道mysql查詢面試題的思考解決過程:啰嗦(可跳過)前幾天面試,筆試時遇到這道題,讀了幾遍題目都是懵懵懂懂,一個段時間內至少N天,這N天中每天的分數總和要大于M,好繞,最后沒有寫對。今天想起來這道題,寫出了答案并進行了sql語句的驗證。推薦:《mysql視頻教程》問題某游戲使用mys
        推薦度:
        標簽: 面試 題目 mysql
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 美女视频黄a视频全免费网站一区 美女视频黄a视频全免费网站色 | 免费va在线观看| 免费看大黄高清网站视频在线| AV免费网址在线观看| 国产青草视频在线观看免费影院| 亚洲精品成人片在线观看| 亚洲国产精品VA在线看黑人| 亚洲经典在线中文字幕| 亚洲国产成人精品无码区二本| 一级人做人a爰免费视频| 2019中文字幕免费电影在线播放| 国产麻豆剧传媒精品国产免费| 亚洲AV人无码综合在线观看| 久久久久亚洲国产| 日批视频网址免费观看| 在线观看免费a∨网站| 久久久亚洲裙底偷窥综合| 免费人成动漫在线播放r18| 最近2019中文字幕免费看最新| 国产偷v国产偷v亚洲高清| 国产精品国产亚洲区艳妇糸列短篇 | 久久久久亚洲爆乳少妇无| 亚洲校园春色另类激情| 在线看片免费人成视频福利| 国产免费私拍一区二区三区| 久久精品国产亚洲av高清漫画| 中国一级毛片免费看视频| 美女视频黄的全免费视频网站| 夜色阁亚洲一区二区三区| 亚洲人成高清在线播放| 99久久精品免费精品国产| 亚洲中文字幕无码不卡电影| 精品无码专区亚洲| 亚洲欧洲美洲无码精品VA| 日韩a毛片免费观看| 亚洲av不卡一区二区三区| 性色av无码免费一区二区三区| 一个人晚上在线观看的免费视频| 亚洲精品无码不卡| 99精品一区二区免费视频| 亚洲久热无码av中文字幕|