Maison > base de données > tutoriel mysql > Réflexions et solutions à une question d'entretien de requête MySQL

Réflexions et solutions à une question d'entretien de requête MySQL

藏色散人
Libérer: 2020-09-02 15:58:00
avant
2960 Les gens l'ont consulté

Oupy (peut être ignoré)

Il y a quelques jours, lors de l'entretien, j'ai rencontré cette question lors de l'examen écrit. Après avoir lu la question plusieurs fois, j'étais encore confuse. , "Sur une période de temps. Au moins pendant N jours, la somme des scores pour chaque jour de ces N jours doit être supérieure à M." C'était tellement déroutant que je ne l'ai finalement pas écrit correctement.

J'ai pensé à cette question aujourd'hui, j'ai écrit la réponse et vérifié la déclaration SQL.

Recommandé : "tutoriel vidéo mysql", "questions d'entretien mysql2020"

questions

Un certain jeu utilise une base de données MySQL. Les scores du tableau de données enregistrent l'historique des scores de l'utilisateur, le score représente le score et la date représente la date. Chaque utilisateur générera plusieurs enregistrements chaque jour.

La structure des données et les lignes de données sont les suivantes :

Réflexions et solutions à une question dentretien de requête MySQL

Maintenant, nous avons besoin d'une liste d'utilisateurs. Ces utilisateurs doivent avoir au moins 31 utilisateurs sur les 31. jours de mars 2017. Pendant 16 jours, le score total chaque jour est supérieur à 40 points. Exprimé à l'aide d'une instruction SQL.

Les choses

Réorganiser les exigences et dessiner les points clés.

Nous avons maintenant besoin d'une liste d'utilisateurs qui ont un score quotidien supérieur à 40 points pendant au moins 16 des 31 jours de mars 2017. Exprimé à l'aide d'une instruction SQL.

Liste d'utilisateurs

représente une liste d'uid unique, qui peut être implémentée à l'aide de l'uid DISTINCT ou de l'uid GROUP BY.

Dans les 31 jours de mars 2017

Utilisez l'instruction Where pour limiter la plage horaire.

Il doit y avoir au moins 16 jours

Il faut agréger les jours et utiliser la fonction d'agrégation COUNT(*) >

La somme des scores journaliers (par personne) est supérieure à 40

Il faut agréger les scores journaliers et utiliser la fonction d'agrégation pour juger SUM(score) > 40 .

Il existe deux fonctions d'agrégation ici, mais elles concernent des dimensions différentes (jours et scores par jour), vous devez donc utiliser des sous-requêtes pour placer les deux agrégations respectivement sur les instructions SQL internes et externes.

Sur la base du principe du « de l'intérieur vers l'extérieur », nous agrégeons d'abord les scores quotidiens, c'est-à-dire agrégeons les journées.

-- 在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;
Copier après la connexion

Réponse

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;
Copier après la connexion

Vérification

-- 结构
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
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:segmentfault.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal