Dai Chong's blog

引言

 说起排行榜上一篇已经介绍过了用Redis实现的方法,而这篇完全是用Sql来实现,不使用任何缓存。

需求功能(1)

 现有十个同学,年龄分布如下图所示,假设你是戴七,请根据年龄获得你在这十人中排第几?同时请获得你的前一名和后一名各是哪一位同学?

 这个题是我去年在一家公司被问到的面试题。根据上图分析,获取到自己的排名并不是难事,那前一名和后一名也非常简单了。

 上篇简单的介绍了视图的概念,那么这篇将告诉大家如何创建、修改、删除视图,也就是视图的基本操作了!

一、在单表上创建视图

1
2
3
4
5
6
7
8
# 创建表 user
create table user (id int,name varchar(10),age tinyint(3));
# 插入数据
insert into user values(1,'张三',20),(2,'李四',20);
# 创建视图-并计算他们两年之后多少岁
create view view_user as select id,name,age+2 as age from user;
# 第二种写法
create view view_user_1(user_id,user_name,user_age) as select id,name,age from user;

一、视图的含义

 1.视图是从一个或多个表中导出的,视图的行为与表非常的相似,但视图是一个虚拟的表。在视图中可以使用Select语句进行查询,也可以使用InsertUpdateDelete,视图还可以从已经存在的视图的基础上定义(也就是视图上再做视图)。

两张多对多关系的表进行数据关联查询,有两种常见的写法(我只知道两种,嘿嘿):
(1) 从主表中查出来所关联的字段,例如order_id,然后循环数组将order_id用逗号隔开;副表进行in查询(当然这种写法比较low,新手使用的比较多)

(2) 使用leftJoin关联,左边为主表
以上仅举例

有些情况下只能使用先查再in的写法,那么怎么简化它呢(就不想先查再循环连接)?

那么一个mysql的函数就能使用上了,他就是GROUP_CONCAT().这个函数就是把某个字段的值用字符串连接成A,B,C这样的格式

今天来写一篇如何优化在循环里的sql。相信大家都会遇到在foreach里循环操作数据库,上学的时候一听到循环查表这类的词,哇!感觉很高端,殊不知这样的操作对数据库的压力是无限大的。像一个三级的分类数据操作,很多人会选择循环查表,毕竟这样的写法是最方便、最简单的。前期数据量小的时候是没有很明显的问题,到了一定程度,你会发现页面加载速度越来越慢,数据库的压力越来越大。这个时候你必须要选择修改你的程序了!

但是这篇文章不是来介绍如何优化循环查询的,是介绍如何来优化循环修改表数据的。

mysql on duplicate key update 对于不是很常用的人来说是比较陌生的。那么他到底是用来干什么的呢?下面就介绍一下:

比如在我们做一个点击量的功能,程序的逻辑是这样的:
在用户点击的时候我们首先要判断数据表中已经存在了这个人的数据,如果存在日志表对应的用户点击次数加1,如果不存在新增一条数据。

那么按照正常的编程需要有两条sql

先查询数据表中是否有,有了执行修改操作,没有执行添加操作。一条查询一条修改或添加。

那么有了这个on duplicate key update 之后就可以把这两个sql简化为一条,减少了数据的查询次数、避免了数据重复而且少打一些代码,可谓是一举三得!

sql删除数据库重复的数据

今天在工作中遇到了一个注册绑定微信UID的问题。按正常逻辑来说,一个手机号只能绑定一个UId,但问题总是会只有你想不到没有你做不到,有个客户居然用一个手机号绑定了几百个手机号,具体是为了干什么就不说了。有一个人能想到这样的方法,就会有第二个人能想到,之后就不用说了越来越多。仅仅几天数据库里的数据已经几万条了,慢慢的我意识到了这样下去肯定是不行的,必须想办法解决。刚开始是手动删除重复的数据,但是太多了,手动删简直是没法弄,不删还不行,给字段加唯一索引必须要把重复的数据删掉.