>데이터 베이스 >MySQL 튜토리얼 >MySQL 쿼리 인터뷰 질문에 대한 생각과 솔루션

MySQL 쿼리 인터뷰 질문에 대한 생각과 솔루션

藏色散人
藏色散人앞으로
2020-04-08 08:57:352954검색

죄송합니다(건너뛸 수 있음)

몇일전에 면접을 봤습니다. 필기시험 중에 이런 질문이 나왔습니다. 문제를 여러 번 읽어도 여전히 이해가 되지 않습니다. 일정 기간의 일수이고, 이 N일 각각의 일수는 점수의 합이 M보다 커야 합니다." 너무 헷갈려서 결국 제대로 쓰지 못했습니다.

오늘 이 질문이 생각나서 답변을 작성하고 SQL 문을 확인했습니다.

추천: "mysql 비디오 튜토리얼", "mysql 인터뷰 질문2020"

questions

특정 게임은 mysql 데이터베이스를 사용하며 데이터 테이블 점수는 사용자 점수 내역을 기록하며 uid는 사용자 ID를 나타냅니다. , 점수는 점수를 나타내며, 각 사용자는 매일 여러 개의 기록을 생성합니다.

데이터 구조와 데이터 행은 다음과 같습니다.

MySQL 쿼리 인터뷰 질문에 대한 생각과 솔루션

이제 2017년 3월 31일 중 최소 16일 동안 일일 점수가 40점보다 큰 사용자 목록이 필요합니다. SQL 문을 사용하여 표현합니다.

Things

요구사항을 재구성하고 핵심 포인트를 그려보세요.

이제 2017년 3월 31일 중 최소 16일 동안 일일 점수가 40점 이상인 사용자 목록이 필요합니다. SQL 문을 사용하여 표현합니다.

User list

는 고유한 uid 목록을 나타내며 DISTINCT uid 또는 GROUP BY uid를 사용하여 구현할 수 있습니다.

2017년 3월 31일

where 문을 사용하여 시간 범위를 제한하세요.

최소 16일이 있어야 합니다

일수를 집계하고 집계 함수 COUNT(*) > 15를 사용하여 판단해야 합니다.

(1인당) 일일 점수의 합이 40보다 큽니다

일일 점수를 집계하고 집계 기능을 사용하여 SUM(점수) > 40을 판단해야 합니다.

여기에는 두 개의 집계 함수가 있지만 차원(일수 및 일별 점수)이 다르기 때문에 하위 쿼리를 사용하여 두 집계를 내부 및 외부 SQL 문에 각각 배치해야 합니다.

"내부에서 외부로"라는 원칙에 따라 먼저 일일 점수, 즉 날짜를 집계합니다.

-- 在2017年3月份的31天中
select * from scores where `date` >= &#39;2017-03-01&#39; and `date` <= &#39;2017-03-31&#39;;
-- (每人)每天得分总和大于40
-- 使用 group by uid,date 实现对分数进行聚合,使用 having  sum() 过滤结果
select uid,date from scores where `date` >= &#39;2017-03-01&#39; and `date` <= &#39;2017-03-31&#39; group by uid, `date` having sum(score) > 40;
-- 至少要有16天
-- 以上条结果为基础,在对 group by uid 实现对天进行聚合,使用 having  count() 过滤结果
select uid from (
    select uid,date from scores where `date` >= &#39;2017-03-01&#39; and `date` <= &#39;2017-03-31&#39; group by uid, `date` having sum(score) > 40
) group by uid having count(*) > 15;

답변

SELECT uid FROM (
    SELECT uid,date FROM WHERE `date` >= &#39;2017-03-01&#39; AND `date` <= &#39;2017-03-31&#39; 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 (&#39;1&#39;, &#39;1&#39;, &#39;1&#39;, &#39;2018-04-03&#39;);
INSERT INTO `scores` VALUES (&#39;2&#39;, &#39;1&#39;, &#39;2&#39;, &#39;2018-04-03&#39;);
INSERT INTO `scores` VALUES (&#39;3&#39;, &#39;1&#39;, &#39;1&#39;, &#39;2018-04-04&#39;);
INSERT INTO `scores` VALUES (&#39;11&#39;, &#39;1&#39;, &#39;4&#39;, &#39;2018-04-04&#39;);
INSERT INTO `scores` VALUES (&#39;12&#39;, &#39;1&#39;, &#39;3&#39;, &#39;2018-04-06&#39;);
INSERT INTO `scores` VALUES (&#39;4&#39;, &#39;1&#39;, &#39;3&#39;, &#39;2018-04-07&#39;);
INSERT INTO `scores` VALUES (&#39;5&#39;, &#39;2&#39;, &#39;2&#39;, &#39;2018-04-04&#39;);
INSERT INTO `scores` VALUES (&#39;6&#39;, &#39;2&#39;, &#39;4&#39;, &#39;2018-04-04&#39;);
INSERT INTO `scores` VALUES (&#39;7&#39;, &#39;2&#39;, &#39;1&#39;, &#39;2018-04-03&#39;);
INSERT INTO `scores` VALUES (&#39;8&#39;, &#39;3&#39;, &#39;3&#39;, &#39;2018-04-06&#39;);
INSERT INTO `scores` VALUES (&#39;9&#39;, &#39;3&#39;, &#39;1&#39;, &#39;2018-04-05&#39;);
INSERT INTO `scores` VALUES (&#39;10&#39;, &#39;3&#39;, &#39;2&#39;, &#39;2018-04-04&#39;);
-- 因为数据录入量有限,我们将结果改为修改改为:
-- 获取一个用户列表,时间范围是4号到6号,至少要有2天,每天分数总和大于2。
-- 查询
-- 非最精简语句,包含调试语句,可分段运行查看各个语句部分的效果。
SELECT
    uid
FROM
    (
        SELECT
            uid,
            `date`,
            sum(score) AS total_score
        FROM
            scores
        WHERE
            `date` > &#39;2018-04-03&#39;
        AND `date` < &#39;2018-04-07&#39;
        GROUP BY
            uid,
            `date`
        HAVING
            total_score > 2
        ORDER BY
            uid,
            date
    ) AS a
GROUP BY
    uid
HAVING
    count(*) > 1;
-- 答案是:
uid : 1

위 내용은 MySQL 쿼리 인터뷰 질문에 대한 생각과 솔루션의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제