죄송합니다(건너뛸 수 있음)
몇일전에 면접을 봤습니다. 필기시험 중에 이런 질문이 나왔습니다. 문제를 여러 번 읽어도 여전히 이해가 되지 않습니다. 일정 기간의 일수이고, 이 N일 각각의 일수는 점수의 합이 M보다 커야 합니다." 너무 헷갈려서 결국 제대로 쓰지 못했습니다.
오늘 이 질문이 생각나서 답변을 작성하고 SQL 문을 확인했습니다.
추천: "mysql 비디오 튜토리얼", "mysql 인터뷰 질문2020"
questions
특정 게임은 mysql 데이터베이스를 사용하며 데이터 테이블 점수는 사용자 점수 내역을 기록하며 uid는 사용자 ID를 나타냅니다. , 점수는 점수를 나타내며, 각 사용자는 매일 여러 개의 기록을 생성합니다.
데이터 구조와 데이터 행은 다음과 같습니다.
이제 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` >= '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
위 내용은 MySQL 쿼리 인터뷰 질문에 대한 생각과 솔루션의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!