Mysql中IF()函数使用

mysql中if()函数具体语法如下:

IF(expr1,expr2,expr3)
#如果expr1的值为true,则返回expr2的值。
#如果expr1的值为false,则返回expr3的值。

其经常判断查询出来的值,示例;

mysql> select name,if(sex=0,'女','男') as sex from student;
+-------+-----+
| name  | sex |
+-------+-----+
| name1 | 女  |
| name2 | 女  |
| name3 | 男  |
| name4 | 女  |
+-------+-----+

其也经常用到判断的关联条件中,其示例如下:

SELECT  s.SCHOOL_CITY as schoolCity,
        s.SCHOOL_COUNTY as schoolCounty,
        count(DISTINCT `s`.`SCHOOL_ID`) as schoolNum,
        sum(m.duration) as sumDuration,
        sum(`m`.`VIEWERCOUNT`) as viewLiveSum,
        sum(m.replayViewerCount)as reViewSum,
        sum(m.praisecount) as sumpraise,
        sum(`m`.`VIEWERCOUNT`+m.replayViewerCount) as viewSum
         from ((tbl_hbb_mobile_live_statistics m join tbl_hbb_resource_visit_map v) join tbl_school_info s)
    where`m`.`RESOURCEID`= `v`.`RESOURCEID` 
        and if((`v`.`rangeTYPE`= '2'),(`v`.`rangeID`= `s`.`SCHOOL_ID`),(`v`.`parentId`= `s`.`SCHOOL_ID`))

转载至:https://www.cnblogs.com/zjdxr-up/p/8383609.html

Mysql用户变量@

用户变量

可以先在用户变量中保存值留待以后引用,可以将值从一个语句中传递到另一个语句;用户变量和连接有关,所以客户端连接断开后自动销毁。
用户变量的形式为@var_name,其中变量名var_name可以由当前字符集的文字数字字符、‘.’、‘_’和‘$’组成。 默认字符集是cp1252 (Latin1)。可以用mysqld的–default-character-set选项更改字符集。参见5.10.1节,“数据和排序用字符集”。用户变量名对大小写不敏感。

默认值

没有初始化的用户变量默认为 NULL
如果用户变量分配了一个字符串值,其字符集和校对规则与该字符串的相同。用户变量的可压缩性(coercibility)是隐含的。(即为表列值的相同的可压缩性(coercibility)。

设置用户变量方法

设置用户变量方法1

设置用户变量的一个途径是执行SET语句:

SET @var_name = expr [, @var_name = expr] ...

对于SET,可以使用=或:=作为分配符。分配给每个变量的expr可以为整数、实数、字符串或者NULL值。

设置用户变量方法2

也可以用语句代替SET来为用户变量分配一个值。在这种情况下,分配符必须为:=而不能用=,因为在非SET语句中=被视为一个比较 操作符:

mysql> SET @t1=0, @t2=0, @t3=0;
mysql> SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
+----------------------+------+------+------+
| @t1:=(@t2:=1)+@t3:=4 | @t1  | @t2  | @t3  |
+----------------------+------+------+------+
|                    5 |    5 |    1 |    4 |
+----------------------+------+------+------+

用户变量的表达式用法

用户变量可用在表达式中。目前不包括明显需要文字值的上下文中,例如SELECT语句的LIMIT子句,或者LOAD DATA语句的IGNORE number LINES子句。

注释:在SELECT语句中,表达式在发送到客户端后才计算,这说明在HAVING,GROUP BY,ORDER BY 字句中,不能使用包含SELECT列表中所设的变量的表达式。
例如,下面的语句不能按期望工作:

mysql> SELECT (@aa:=id) AS a,(@aa+3) AS b FROM table HAVING b=5;

HAVING子句中引用了SELECT列表中的表达式的别名,使用@aa。不能按期望工作:@aa不包含当前行的值,而是前面所选的行的id值。

一般原则是不要在语句的一个部分为用户变量分配一个值而在同一语句的其它部分使用该变量。可能会得到期望的结果,但不能保证。

设置变量并在同一语句中使用它的另一个问题是变量的默认结果的类型取决于语句前面的变量类型。
下面的例子说明了该点:

mysql> SET @a='test';
mysql> SELECT @a,(@a:=20) FROM tbl_name;

对于该 SELECT语句,MySQL向客户端报告第1列是一个字符串,并且将@a的所有访问转换为字符串,即使@a在第2行中设置为一个数字。执行完SELECT语句后,@a被视为下一语句的一个数字。

要想避免这种问题,要么不在同一个语句中设置并使用相同的变量,要么在使用前将变量设置为0、0.0或者”以定义其类型。

未分配的变量有一个值NULL,类型为字符串


用户变量实践:

编写一个 SQL 查询,查找所有至少连续出现三次的数字。

+----+-----+
| Id | Num |
+----+-----+
| 1  |  1  |
| 2  |  1  |
| 3  |  1  |
| 4  |  2  |
| 5  |  1  |
| 6  |  2  |
| 7  |  2  |
+----+-----+
例如,给定上面的 Logs 表, 1 是唯一连续出现至少三次的数字。

+-----------------+
| ConsecutiveNums |
+-----------------+
| 1               |
+-----------------+

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/consecutive-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解:

#方法1 
#连续出现的意味着相同数字的 Id 是连着的,由于这题问的是至少连续出现 
#3 次,我们使用 Logs 并检查是否有 3 个连续的相同数字。
#并添加关键字 DISTINCT ,去除重复元素。
SELECT DISTINCT
    l1.Num AS ConsecutiveNums
FROM
    Logs l1,
    Logs l2,
    Logs l3
WHERE
    l1.Id = l2.Id - 1
    AND l2.Id = l3.Id - 1
    AND l1.Num = l2.Num
    AND l2.Num = l3.Num
#但是以上方法存在一个问题就是,当数据出现物理删除导致ID不连贯的时候会出现异常

#方法2
#使用用户变量,用cnt和pre两个变量来统计
select DISTINCT a.Num ConsecutiveNums from (
    select t.Num,
    @cnt:=IF(@pre=t.Num,@cnt+1,1) cnt,
    @pre:=t.Num pre 
    from Logs t,(select @cnt:=0,@pre:=NULL) b ORDER BY t.Id asc) a
where a.cnt>=3
#满足题意,并解决了数据物理删后ID不连续的问题

apk打包流程

使用hbulid打包APP-安卓系列
首先需要安装jdk、jre环境
环境安装,参考链接
https://blog.csdn.net/qq_36554582/article/details/81814096
配置环境变量有点麻烦,偷懒的我直接装完就算了。
安装路径:C:\Program Files\Java\jdk-12.0.2\bin
文件bin/下有:keytool.exe 文件,此文件用于生成密钥,

打开命令cmd->如果不是C盘根目录,可以用输入 cd.. ,返回上一级到出现:C:>
然后进去JDK 文件: C:> cd C:\Program Files\Java\jdk-12.0.2\bin 然后回车键,我的JDK安装在C盘Program Files下,如果你不是可以更改,

到打开:C:\Program Files\Java\jdk-12.0.2\bin>

然后对下面代码修改下,

keytool -genkey -alias domekey -keyalg RSA -keysize 1024 -keypass pwd123456 -validity 3500 -keystore c:\key\dome.keystore

-alias 后面的 domekey 是密钥别名,可自己修改
-keypass 后面的 pwd123456 ,可自己修改
会生成密钥文件dome.keystore,存在 c:\key\dome.keystore ,如果你C盘没有key文件夹,要新建一个,不如会报错。
-validity 后面的 3500 ,是有效期,3500天,按天数算

然后填写好复制进去: C:\Program Files\Java\jdk1.6.0_43\bin>keytool -genkey -alias domekey -keyalg RSA -keysize 1024 -keypass pwd123456 -validity 3500 -keystore c:\key\dome.keystore

然后回车键,会提示你输入密码,这个密码是查询密码,跟密钥密码填一样的, 不一样,云打包不了,不知道为什么。

然后就是填写,

填好后,最后 填 Y 回车确认,就可以了,生成的dome.keystore,文件在C盘c:\key\下,

按照以上步骤打包时候可能会提示证书文件不是有效的keystore文件
这是说 格式不对啦
此时运行命令,转换下格式

keytool -importkeystore -srckeystore c:\key\dome.keystore -destkeystore c:\key\dome.keystore -deststoretype JKS

然后云打包,

选择安卓》自有证书

包名: 可以自己修改

证书别名: domekey,就是刚才你填写的密钥别名

密钥密码:pwd123456 ,就刚你填的密码

证书文件:c:\key\dome.keystore ,选择刚才你生成的文件,

然后提交云打包就可以了,可以打包成功, 安装正常使用。

以上,完毕
参考链接:
http://www.cat007.cn/2019/06/22/%e7%8e%a9%e6%b3%a5%e5%b7%b4%e4%b9%8bkeytool%e6%89%93%e5%8c%85%e6%b5%81%e7%a8%8b/

http://ask.dcloud.net.cn/article/12718

Nginx 配置wss

最近小程序用到WebSockets,服务器安装完环境和配置完nginx配置后老是出现错误代码1006;百思不得其姐之后,怀疑是因为自己nginx转发配置错了
最后发现,wss配置需要配置在ssl配置下,而我写错地方了,下面列出正确的配置


location /wss/ { proxy_pass http://127.0.0.1:2345; proxy_set_header X-Real-IP remote_addr; proxy_set_header Hosthost; proxy_set_header X-Forwarded-For proxy_add_x_forwarded_for; proxy_http_version 1.1; proxy_set_header Upgradehttp_upgrade; proxy_set_header Connection "upgrade"; rewrite /wss/(.*) /$1 break; proxy_redirect off; }

服务器nginx完整配置

server {
        listen       80;
        root /www/web/app_xxx_com/public_html;
        server_name app.xxx.com;
        index index.php;
        error_page  400 /errpage/400.html;
        error_page  403 /errpage/403.html;
        error_page  404 /errpage/404.html;
        error_page  503 /errpage/503.html;
        location ~ \.php{
                proxy_pass http://127.0.0.1:88;
                include naproxy.conf;
        }
        location ~ /\.ht {
                deny  all;
        }
        location / {
                try_filesuri @apache;
        }

        location @apache {
                 internal;
                 proxy_pass http://127.0.0.1:88;
                 include naproxy.conf;
        }
}

server {
        listen       443;
        root /www/web/app_xxx_com/public_html;
        ssl                  on;
        ssl_certificate      cert/app.xxx.com.pem;
        ssl_certificate_key  cert/app.xxx.com.key;
        ssl_prefer_server_ciphers on;
        ssl_session_timeout 10m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
        server_name app.xxx.com;
        index index.php;
        error_page  400 /errpage/400.html;
        error_page  403 /errpage/403.html;
        error_page  404 /errpage/404.html;
        error_page  503 /errpage/503.html;
        location ~ \.php{
                proxy_pass http://127.0.0.1:88;
                include naproxy.conf;
        }
        location ~ /\.ht {
                deny  all;
        }
        location / {
                try_filesuri @apache;
        }
        location @apache {
                 internal;
                 proxy_pass http://127.0.0.1:88;
                 include naproxy.conf;
        }
        location /wss {
                 proxy_pass http://127.0.0.1:2345;
                 proxy_http_version 1.1;
                 proxy_set_header Upgrade http_upgrade;
                 proxy_set_header Connection "Upgrade";
                 proxy_set_header X-Real-IPremote_addr;
        }

}

参考链接:https://wenda.workerman.net/question/1485
https://blog.csdn.net/Phoenix_smf/article/details/89278398

MySQL中的describe命令-查看设计信息

describe命令
一、describe命令用于查看特定表的详细设计信息,例如为了查看guestbook表的设计信息,可用:
describe guestbook

describe ol_user userid

二、可通过”show columns ”来查看数据库中表的列名,有两种使用方式:
show columns form 表名 from 数据库名

或者:

show columns from 数据库名.表名

三、用describe命令查询具体列的信息
describe guestbook id

就是查询guestbook中id字段的列信息

{DESCRIBE | DESC} tbl_name [col_name | wild]

DESCRIBE 是 SHOW COLUMNS FROM 的缩写。

DESCRIBE 提供有关一个表的列信息。col_name 可以是一个列名或是一个包含 SQL 通配符字符 “%” 和 “_” 的字符串。没有必要用引号包围字符串。

转载至MySQL中的describe命令

MySql 在update中实现子查询

MySql更新语句中,经常会碰到需要使用子查询限定更新范围的情况,但是mysql更新语句是不支持子查询的

#例如这样当使用mysql条件更新时--最先让人想到的写法  
UPDATE user SET isagent=1 WHERE uid IN (SELECT uid FROM user_agent) 

#此语句是错误的,会报错 You can't specify target table 'xxx' for update in FROM

这是因为:

mysql的update的一些特点

1、update 时,更新的表不能在set和where中用于子查询;

2、update 时,可以对多个表进行更新(sqlserver不行);

     如:update ta a,tb b set a.Bid=b.id ,b.Aid=a.id;  

3、update 后面可以做任意的查询,这个作用等同于from;

正确的方式是,例:

#简单的更新语句
UPDATE `user` u SET u.`status`=1 WHERE u.`isagent`='1'

#复杂的更新语句
例子1
update member m,(SELECT * FROM FansRole) r set m.agentlevel=(case r.FanskindID when 1 then 0 else r.FanskindID+2 end),m.`level`=r.FanskindID,m.isagent=1,m.`status`=1,m.agenttime=UNIX_TIMESTAMP(r.RegTime) where m.id=r.UserID
例子2
UPDATE order_mall a,(SELECT order_mall.id FROM `order_mall`,`order_goods` WHERE order_mall.`id`=order_goods.`order_id` AND order_goods.order_status=8 AND order_goods.order_goods_type=3) b 
SET a.`status`=4
WHERE a.id=b.id

MySQL中随机生成固定长度字符串的方法

在MySQL中有时需要随机生成指定位数数字或字符串,随机生产数字可直接使用rand()函数,但是要随机生成字符串就比较麻烦。

要随机生成字符串代码如下:
在MySQL中定义一个随机串的方法,然后在MySQL语句中调用此方法。

CREATE DEFINER=`root`@`localhost` FUNCTION `rand_string`(n INT) RETURNS varchar(255) CHARSET latin1
BEGIN
    DECLARE chars_str varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    DECLARE return_str varchar(255) DEFAULT '';
    DECLARE i INT DEFAULT 0;
    WHILE i < n DO
        SET return_str = concat(return_str,substring(chars_str , FLOOR(1 + RAND()*62 ),1));
        SET i = i +1;
    END WHILE;
    RETURN return_str;
END;

定义完后,在MySQL语句中调用即可

update member set salt=rand_string(6);

Mysql字符串拼接方法

Mysql中字符串连接

SELECT '12'+'32','1abc'+'22','abc'+'3'
#结果为:44,2,3
#并非我们想要的1232,1abc22,abc3
#注:在Mysql中,使用“+”进行字符连接时,mysql会尝试将字段值转换为数字类型(如果转换失败,就当做数字0处理)。如’1abc’+’22′,mysql将“1abc”转成数字1在进行运算;将“abc”当做0处理。

所以在Mysql中要使用函数CONCAT(str1,str2,…)来进行字符串拼接,CONCAT函数支持一个或者多个参数,参数类型可以为字符串类型也可以是非字符串类型,对于非字符串类型的参数MYSQL将尝试将其转化为字符串类型,CONCAT函数会将所有参数按照参数的顺序拼接成一个字符串做为返回值。

SELECT CONCAT('车型:',type,',颜色:',color) FROM car;
#结果:“车型:紧凑,颜色:骚粉”

项目从MySql5.5迁移到MySql5.7 timestamp默认值不能为空问题

今天客户项目从开发环境搬迁到生产环境时,因为mysql版本不一致,导致部分表格无法迁移
具体原因为Mysql默认不允许timestamp设置0000-00-00 00:00:00的默认值
经过一番搜索,得到几种解决方案
最后方便起见
直接把timestamp格式字段默认值改成了2000-01-01 00:00:00

常见的方法为修改mysql配置文件,把NO_ZERO_IN_DATE,NO_ZERO_DATE这两个配置去掉

在my.cnf[mysqld]下添加

sql-mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION