MySQL基础面试题

时间:2022-06-26
本文章向大家介绍MySQL基础面试题,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

面试题目

实现一个会员签到积分统计功能,第一天签到增加1个积分,第二天签到增加1个积分,第三天签到增加2个积分,第四天签到增加3个积分,第五天增加5个积分。每天只能签一到,中间断签,则重新计算。

面试难点

1.找到其中增加积分的规律 2.数据库设计

数据库设计

START TRANSACTION; 
-- 创建用户表
CREATE TABLE `account` (
  `id` int(1) UNSIGNED NOT NULL COMMENT '用户id',
  `point` int(4) NOT NULL COMMENT '总积分',
  `signday` int(4) NOT NULL COMMENT '连续签到天数'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ALTER TABLE `account` ADD PRIMARY KEY (`id`);
-- 创建用户积分签到表
CREATE TABLE `signup` (
  `id` int(11) NOT NULL COMMENT '用户id',
  `signtime` int(11) NOT NULL COMMENT '签到时间',
  `point` int(11) NOT NULL COMMENT '领取积分'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ALTER TABLE `account`
  MODIFY `id` int(1) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '用户id';
COMMIT;

程序代码

<?php
// 通过分析上面的规律,我们可以看得出,当连续第三天的时候就是前面两天签到的分数相加
// 1.创建数据库连接
$mysqli = new mysqli('127.0.0.1','root','QQadmin001','test');
// 查询数据验证用户最近一次的签到信息
$sql = "select * from signup where id=1 order by signtime desc limit 0,1";
$result = $mysqli->query($sql);
$arr = [];
while($row = mysqli_fetch_assoc($result)){
    $arr['id'] = $row['id'];
    $arr['point'] = $row['point'];
    $arr['signtime'] = $row['signtime'];
}
$insertSql = '';
$updateSql = '';
// 判断是否有数据
if (count($arr) == 0) {
    // 1.如果没数据,则表示用户是第一次登陆,用户是第一次登陆,直接增加一个积分即可
    $insertSql = "insert into signup(`id`,`signtime`,`point`) values(1,".time().",1)";
    $updateSql = "update account set signday = 1 , point=1 where id=1";
}else{
    // 做一天只能登录一次验证
    if (time() - $arr['signtime'] < 24*3600) {
        echo "今天已经登录过了!";
        die();
    }else{
        // 2.如果有数据,则表示用户不是第一次登陆,则进行登录的天数做验证
    // 查询用户连续登录的天数
    $daySql = "select signday from account where id=1";
    $dayRes = $mysqli->query($daySql);
    $day = (mysqli_fetch_assoc($dayRes))['signday'];
    if($day < 2 ) {
        // 还未连续登录到两天
        $updateSql = "UPDATE `account` SET `point`=(point+1),`signday`=(signday+1) WHERE id=1";
        $insertSql = "insert into signup(`id`,`signtime`,`point`) values(1,".time().",1)";
    }elseif (($day> 2 || $day == 2) && (time()-$arr['signtime'] < 24*3600)){
        // 已经连续登录了两次,并且最近登录的时间与现在登录的时间在一天内
        $queryTwoSql = "select * from signup where id=1 order by signtime desc limit 0,2";
        $twoResult = $mysqli->query($queryTwoSql);
        $twoArr = [];
        while($row = mysqli_fetch_assoc($twoResult)) {
            array_push($twoArr, $row['point']);
        }
        // 当前签到的积分
        $nowPoint = array_sum($twoArr);
        $updateSql = "UPDATE `account` SET `point`=(point+$nowPoint),`signday`=(signday+1) WHERE id=1";
        $insertSql = "insert into signup(`id`,`signtime`,`point`) values(1,".time().",$nowPoint)";
    }elseif (($day> 2 || $day == 2) && (time()-$arr['signtime'] > 24*3600)){
        // 已经连续登录了两次,并且最近登录的时间与现在登录的时间超过一天内
        $queryTwoSql = "select * from signup where id=1 order by signtime desc limit 0,2";
        $twoResult = $mysqli->query($queryTwoSql);
        $twoArr = [];
        while($row = mysqli_fetch_assoc($twoResult)) {
            array_push($twoArr, $row['point']);
        }
        // 当前签到的积分
        $insertSql = "insert into signup(`id`,`signtime`,`point`) values(1,".time().",1)";
        $updateSql = "update account set signday = 1 , point=1 where id=1";
    }
    }
}
if($mysqli->query($insertSql)) {
    if($mysqli->query($updateSql)) {
        echo "插入成功!";
    }
}