zoukankan      html  css  js  c++  java
  • mysql 基础技术

    一、树状结构

    参考http://www.cnblogs.com/kingteach/archive/2011/07/05/2098046.html

    create procedure Pro_GetUnderOrg(in userid varchar(50))
    begin
    declare lev int;
    set lev=1;
    drop table if exists tmp1;
        CREATE TABLE tmp1(`ID` BIGINT,LoginID VARCHAR(50),Username varchar(50),pre_LoginID varchar(50) ,levv INT);
        INSERT tmp1 SELECT `ID`, LoginID,Username,pre_LoginID,1 FROM tbUsers WHERE pre_LoginID=userid;
    while  row_count()>0
    do
         set lev=lev+1;
         INSERT tmp1 SELECT t.`ID`, t.LoginID,t.Username,t.pre_LoginID,lev from tbUsers t join tmp1 a on t.pre_LoginID=a.LoginID AND levv=lev-1;
    end while ;
        INSERT tmp1 SELECT `ID`,LoginID,Username,pre_LoginID,0 FROM tbUsers WHERE LoginID=userid;
         SELECT * FROM tmp1 where LoginID <>userid;/*这一步是为了去除自己*/
    end;

     二、存储过程异常处理

    create PROCEDURE Pro_JH(in curr VARCHAR(50),in target VARCHAR(50),in pre VARCHAR(50))
    BEGIN
    DECLARE Li CHAR(18);
    DECLARE t_error INTEGER  DEFAULT 0;  /*注意:申明字段 必须在前面 否则会报错*/
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1; 
    SET Li='';
    START TRANSACTION; 
    select License INTO Li from tbLicense where UserID=curr and hasUsed=0 and Actual is NOT NULL and IsDele=0 LIMIT 1;
    IF Li='' THEN
    ROLLBACK;  
    SELECT '该用户没有可用激活码!';
    ELSE
    update tbLicense set hasUsed=1  where  License= Li and UserID=curr;
    update tbUserMeny set Total=Total-1,Available=Available-1 where userid=curr and type=2;
    INSERT into tbLicenseWallet_Log (userid,ChangeAmount,License,Remark,Price) VALUES ( curr,1,Li,CONCAT('',target,'激活账户'),(select `Value` from tbdictionary where `Key`='jhmdj'));
    UPDATE tbusers set License=Li,`Status`=1,`Role`=(select ID from tbrole where rolecode='VIP') where LoginID = target and pre_LoginID =pre;
    IF t_error = 1 THEN  
                ROLLBACK;  
                            SELECT '错误';
            ELSE  
                COMMIT;  
                            SELECT '';
            END IF;  
    END IF; 
    END;

     三、一次更新多条数据记录

    UPDATE tabl1
        SET filter1 = CASE id
            WHEN 1 THEN 3
            WHEN 2 THEN 4
            WHEN 3 THEN 5
        END
    WHERE id IN (1,2,3)

     四、临时表的使用

    /*获取上级所有的节点 一条语句中只能试用一次临时表*/
    create PROCEDURE Pro_GetParents(in sid INT)
    BEGIN
    declare lev INT;
    DECLARE userid VARCHAR(50);/*pre*/
    select(select pre_LoginID from tbusers u where u.LoginID = temp.userid and IsDele=0) INTO userid from tbgethelp temp where temp.id=(SELECT temp.getid from tbhelp_successlist temp where id=sid);
    set lev=1;
    CREATE TEMPORARY TABLE if not exists tmp2(`ID` BIGINT,`Status` TINYINT(1),LoginID VARCHAR(50),Username varchar(50),pre_LoginID varchar(50),Mobile CHAR(15),CreateTime timestamp,levv INT)
    ENGINE = memory;  
    truncate TABLE tmp2;
    CREATE TEMPORARY TABLE if not exists tmp1(`ID` BIGINT,`Status` TINYINT(1),LoginID VARCHAR(50),Username varchar(50),pre_LoginID varchar(50),Mobile CHAR(15),CreateTime timestamp,levv INT)
    ENGINE = memory;  
    truncate TABLE tmp1;
    
    INSERT tmp2 SELECT `ID`,`Status`,LoginID,Username,pre_LoginID,Mobile,CreateTime,lev FROM tbUsers WHERE LoginID=userid and IsDele =0;
    INSERT tmp1 select * from tmp2;
    while row_count()>0 and EXISTS(SELECT * from tmp1)
    do
         set lev=lev+1;
         INSERT tmp2 SELECT t.`ID`,t.`Status`, t.LoginID,t.Username,t.pre_LoginID,t.Mobile,t.CreateTime,lev from tbUsers t join tmp1 a on t.LoginID = a.pre_LoginID where a.LoginID<>a.pre_LoginID and t.IsDele = 0 AND a.levv=(lev-1);
             if        row_count()>0 THEN
                TRUNCATE TABLE tmp1;
                INSERT tmp1 select * from tmp2 WHERE levv=lev;
             END IF;
    end while;
         SELECT `ID`,`Status`,CASE `Status` when 0 then '未激活' else '已激活' end as StatusName,Username,LoginID,pre_LoginID,Mobile,date_format(CreateTime,'%Y-%c-%d %h:%i:%s')CreateTime,levv FROM tmp2 ORDER BY CreateTime DESC;     
             DROP TEMPORARY TABLE IF EXISTS tmp2; 
             DROP TEMPORARY TABLE IF EXISTS tmp1; 
    end

     五、编码问题

    --查询编码
    show variables like 'char%'
    --修改编码
    character_set_server='utf8'; 

     六、创建用户并授权

    GRANT ALL PRIVILEGES ON 数据库.* TO 用户名@"%" IDENTIFIED BY "密码"; 
    

      

  • 相关阅读:
    【必备】史上最全的浏览器 CSS & JS Hack 手册(转)
    iScroll4.2.5中的无法滑动或点击的解决方案(转)
    无障碍网页设计(WCAG2.0)
    大小端
    TCP报文结构
    A*
    shell中uniq与sort -u 两种去重的对别
    login流程
    类模板成员函数
    game 角色相关记录
  • 原文地址:https://www.cnblogs.com/kongxp/p/mysql.html
Copyright © 2011-2022 走看看