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 "插入成功!";
}
}
- Spring Boot 2.0 新特性(一):配置绑定 2.0 全解析
- MySQL断电恢复的一点简单分析
- Spring Boot 2.0 新特性(二):新增事件ApplicationStartedEvent
- 奇怪的go语言iota
- Golang web服务器处理前端HTTP请求跨域的方法
- MySQL死锁的两个小案例
- Go 的浏览器集成测试
- 关于数据库Prepare返回指针的的问题
- 怎么设置 http 请求 并发 连接数 限制
- MySQL 5.7中锁的一个通用问题
- golang 中sync.WaitGroup以及select简单实用
- Mycat分库分表的简单实践
- Go语言数组
- mac系统下搭建go语言环境
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- NoSQL数据库 -- MongoDB
- 数据抓取练习
- python基础 -- 简单实现HTTP协议
- RabbitMQ 学习
- asp连接access,增删改查
- Spring 中的如何自定义事件处理(Custom Event)
- python基础 -- 自定义排序
- nginx(安装)
- Spring 中基于 AOP 的 XML操作方式
- python基础 -- 内建函数
- virtualenv 安装及使用
- Git 分布式版本控制 -- (1、基本使用)
- python爬虫----(scrapy框架提高(1),自定义Request爬取)
- python基础 -- 异常处理try的使用及一些思考
- 记一次关于MySQL与PHP的蠢事