mysql批量更新写法

mysql批量更新写法

  $namedmp=filter($_POST['namedmp']);
          $namedsp=filter($_POST['namedsp']);
          $nameula=filter($_POST['nameula']);
          $namenva=filter($_POST['namenva']);
          $namedcrm=filter($_POST['namedcrm']);


          $sql='UPDATE wz_chanpinjieshao
    SET titile = CASE id 
        WHEN 1 THEN ?
        WHEN 2 THEN ?
        WHEN 3 THEN ?
        WHEN 4 THEN ?
        WHEN 5 THEN ?
    END
WHERE id IN (1,2,3,4,5)';
        $stmt = \Db::getStmt($sql);
        $isOk=$stmt->execute(array($namedmp,$namedsp,$nameula,$namenva,$namedcrm));
        if($isOk){
            echo json_encode(array('success' => 1, 'msg' => '更新成功', 'data' => ''));
            exit();
        }else{
            echo json_encode(array('success' => 1, 'msg' => '网络繁忙', 'data' => ''));
            exit();
        }

更新多个字段sql语句

UPDATE wz_chanpinjieshao 
  SET title = CASE id WHEN 1 THEN 11 WHEN 2 THEN 22 WHEN 3 THEN 33 WHEN 4 THEN 44 WHEN 5 THEN 55 END,
     summary = CASE id WHEN 1 THEN 11 WHEN 2 THEN 22 WHEN 3 THEN 33 WHEN 4 THEN 44 WHEN 5 THEN 55 END 
     WHERE id IN (1,2,3,4,5)

下面是封装版

 public function updatechanpinjieshao(){
        $nameupdate_ziduan_list=explode(',',$_POST['nameupdate_ziduan']);
        $namelist=array();
        $duogeziduan='';
        foreach ($nameupdate_ziduan_list as $k=>$v) {

            $namedmp = filter($_POST['namedmp_' . $v]);
            array_push($namelist,$namedmp);
            $namedsp = filter($_POST['namedsp_' . $v]);
            array_push($namelist,$namedsp);
            $nameula = filter($_POST['nameula_' . $v]);
            array_push($namelist,$nameula);
            $namenva = filter($_POST['namenva_' . $v]);
            array_push($namelist,$namenva);
            $namedcrm = filter($_POST['namedcrm_' . $v]);
            array_push($namelist,$namedcrm);

            $duogeziduan.= $v . ' = CASE id WHEN 1 THEN ? WHEN 2 THEN ? WHEN 3 THEN ?  WHEN 4 THEN ?  WHEN 5 THEN ? END,';
        }
            $duogeziduan=rtrim($duogeziduan,",");

             $sql = 'UPDATE wz_chanpinjieshao SET '.$duogeziduan.' WHERE id IN (1,2,3,4,5)';


            $stmt = \Db::getStmt($sql);

            $isOk = $stmt->execute($namelist);

        if($isOk){
            echo json_encode(array('success' => 1, 'msg' => '更新成功', 'data' => ''));
            exit();
        }else{
            echo json_encode(array('success' => 1, 'msg' => '网络繁忙', 'data' => ''));
            exit();
        }

    }

mysql查看正在运行的语句

mysql查看正在运行的语句 并且查看运行最多的mysql语句

MySQL 打开 general log 后,所有的查询语句都会记录在 general log 文件,文件为只读方式,但这样general log文件会非常大,所以默认是关闭的。
但有时需要查错等原因,暂时需要打开general log。
打开方法:

 select version();//我的是5.6是支持一个日志的开启。
     
     set global general_log=1;//开启查询日志
     
     set global log_output='TABLE';//general_log支持输出到table: 如果开启了table就会输出到数据库表中 不会输出到文件中
 
     select * from mysql.general_log\G;//查询所有sql语句的使用
      
     select * from (select argument, count(*) as number from mysql.general_log  group by argument)t 
     order by number DESC;//降序排列使用最多的sql语句,值是mysql 的基本功哈。

建议开了1分钟后可以关了 可以进行优化了 然后优化完了 可以清除表再开启测试

set global general_log = off; // 关闭查询日志
show global variables like '%general%';

mysql left join 右表数据不唯一的情况解决方法

mysql left join 右表数据不唯一的情况解决方法

member 表
id	username
1	fdipzone
2	terry



member_login_log 表
id	uid	logindate
1	1	2015-01-01
2	2	2015-01-01
3	1	2015-01-02
4	2	2015-01-02
5	2	2015-01-03

select a.id, a.username, b.logindate  
from member as a   
left join (select uid, max(logindate) as logindate from member_login_log group by uid) as b  
on a.id = b.uid; 

ps:使用left join的两个表,最好是1:1 或 1:0的关系,这样可以保证A表的记录全部显示,B表显示符合条件的记录。
如果B表符合条件的记录不唯一,就需要检查表设计是否合理了。

mysql互换表中两列数据

mysql互换表中两列数据

update product set original_price=price,price=original_price;

上面sql语句显然不可取
因为先执行original_price=price , original_price的值已经更新为price,
然后执行price=original_price,

正确如下

update product as a, product as b set a.original_price=b.price, a.price=b.original_price where a.id=b.id;

a和b个人觉得应该是2个临时表 最后一定要用where 不用where会出现不对应的情况

mysql You can’t specify target table for update in FROM clause解决方法

mysql You can’t specify target table for update in FROM clause解决方法
出现这个错误的原因是不能在同一个sql语句中,先select同一个表的某些值,然后再update这个表。

mysql> update message set content='Hello World' where id in(select min(id) from message group by uid);
ERROR 1093 (HY000): You can't specify target table 'message' for update in FROM clause

因为在同一个sql语句中,先select出message表中每个用户消息的最小id值,然后再更新message表,因此会出现 ERROR 1093 (HY000): You can’t specify target table ‘message’ for update in FROM clause 这个错误。

解决方法:select的结果再通过一个中间表select多一次,就可以避免这个错误

update message set content='Hello World' where id in( select min_id from ( select min(id) as min_id from message group by uid) as a );

mysql 连接闪断自动重连的方法(用在后台运行中的PHP代码)

mysql 连接闪断自动重连的方法(用在后台运行中的PHP代码)
当mysql断开连接 $_instance这个还是有值得 所以会报错 MySQL server has gone away 这个地方需要捕捉异常才可以或许到
需要 清空连接 $_instance 这样就可以重新连接 就会报错了

<?php
// 数据库操作类
class DB{

    // 保存数据库连接
    private static $_instance = null;

    // 连接数据库
    public static function get_conn($config){
        if(isset(self::$_instance) && !empty(self::$_instance)){
            return self::$_instance;
        }

        $dbhost = $config['host'];
        $dbname = $config['dbname'];
        $dbuser = $config['user'];
        $dbpasswd = $config['password'];
        $pconnect = $config['pconnect'];
        $charset = $config['charset'];

        $dsn = "mysql:host=$dbhost;dbname=$dbname;";
        try {
            $h_param = array(
                    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,   //设置错误级别
            );
            if ($charset != '') {
                $h_param[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET NAMES ' . $charset; //设置默认编码
            }
         
            if ($pconnect) {
                $h_param[PDO::ATTR_PERSISTENT] = true;   //是否是长连接
            }
            $conn = new PDO($dsn, $dbuser, $dbpasswd, $h_param);

        } catch (PDOException $e) {
            throw new ErrorException('Unable to connect to db server. Error:' . $e->getMessage(), 31);
        }

        self::$_instance = $conn;
        return $conn;
    }

    // 执行查询
    public static function query($dbconn, $sqlstr, $condparam){
        $sth = $dbconn->prepare($sqlstr);
        try{
            $sth->execute($condparam);
        } catch (PDOException $e) {
            echo $e->getMessage().PHP_EOL;
            self::reset_connect($e->getMessage()); // 出错时调用重置连接
        }
        $result = $sth->fetchAll(PDO::FETCH_ASSOC);
        return $result;
    }

    // 重置连接
    public static function reset_connect($err_msg){
        if(strpos($err_msg, 'MySQL server has gone away')!==false){
            self::$_instance = null;
        }
    }

}
?>

PDO 查询mysql返回字段int变为String型解决方法

PDO 查询mysql返回字段int变为String型解决方法
使用PDO查询mysql数据库时,执行prepare,execute后,返回的字段数据全都变为字符型。

例如id在数据库中是Int的,查询后返回是String型。

对于PHP这种弱类型的语言,影响不大。在做API返回数据时,如果类型与数据库不一致,对于Java和Objective C这些强类型,影响就很大了。

<?php
$pdo = new PDO($dsn, $user, $pass, $param);

// 在创建连接后,加入
$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
?>

这两句设置的作用
PDO::ATTR_STRINGIFY_FETCHES 提取的时候将数值转换为字符串。
PDO::ATTR_EMULATE_PREPARES 启用或禁用预处理语句的模拟。

mysql 查看当前使用的配置文件my.cnf的方法

mysql 查看当前使用的配置文件my.cnf的方法

ps aux|grep mysql|grep 'my.cnf'

如果上面的命令没有输出,表示没有设置使用指定目录的my.cnf。

如果没有设置使用指定目录的my.cnf,mysql启动时会读取安装目录根目录及默认目录下的my.cnf文件。
mysql –help|grep ‘my.cnf’
/etc/my.cnf, /etc/mysql/my.cnf, /usr/local/etc/my.cnf, ~/.my.cnf 这些就是mysql默认会搜寻my.cnf的目录,顺序排前的优先。

如果没有设置使用指定目录my.cnf文件及默认读取目录没有my.cnf文件,表示mysql启动时并没有加载配置文件,而是使用默认配置。

需要修改配置,可以在mysql默认读取的目录中,创建一个my.cnf文件(例如:/etc/my.cnf),把需要修改的配置内容写入,重启mysql后即可生效。