前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL基础面试题

MySQL基础面试题

作者头像
Mandy的名字被占用了
发布2019-07-22 16:17:36
6910
发布2019-07-22 16:17:36
举报
文章被收录于专栏:菜鸟成长学习笔记

面试题目

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

面试难点

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

数据库设计

代码语言:javascript
复制
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;

程序代码

代码语言:javascript
复制
<?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 "插入成功!";
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 卡二条的技术圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档